Squerly从嵌套的dict和list中去掉了单调乏味的内容。
squerl的Python项目详细描述
概述
让在python字典和列表的嵌套中四处挖掘变得不那么乏味。在
动机
假设您有一堆这样的yaml文档(为了简洁起见,截取了一些数据):
计划程序:
apiVersion:operator.openshift.io/v1kind:KubeSchedulermetadata:annotations:release.openshift.io/create-only:'true'creationTimestamp:2019-09-09 06:16:52+00:00generation:1name:clusterresourceVersion:'20599'selfLink:/apis/operator.openshift.io/v1/kubeschedulers/clusteruid:6a531a9d-d2c9-11e9-b8a1-005056be2a3bspec:managementState:Managedstatus:conditions:-lastTransitionTime:2019-09-09 06:41:57+00:00status:'False'type:MonitoringResourceControllerDegradedlatestAvailableRevision:6latestAvailableRevisionReason:''nodeStatuses:-currentRevision:6nodeName:control-plane-0-currentRevision:6nodeName:control-plane-2-currentRevision:5nodeName:control-plane-1targetRevision:6readyReplicas:0
管制员
^{pr2}$APIServer服务器
apiVersion:operator.openshift.io/v1kind:KubeAPIServermetadata:annotations:release.openshift.io/create-only:'true'creationTimestamp:2019-09-09 06:16:52+00:00generation:4name:clusterresourceVersion:'20635'selfLink:/apis/operator.openshift.io/v1/kubeapiservers/clusteruid:6a5ecbb4-d2c9-11e9-b8a1-005056be2a3bspec:logLevel:''managementState:ManagedobservedConfig:admission:pluginConfig:network.openshift.io/ExternalIPRanger:configuration:allowIngressIP:falseapiVersion:network.openshift.io/v1kind:ExternalIPRangerAdmissionConfignetwork.openshift.io/RestrictedEndpointsAdmission:configuration:apiVersion:network.openshift.io/v1kind:RestrictedEndpointsAdmissionConfigrestrictedCIDRs:-10.128.0.0/14-172.30.0.0/16apiServerArguments:cloud-config:-/etc/kubernetes/static-pod-resources/configmaps/cloud-config/configcloud-provider:-some_cloudfeature-gates:-ExperimentalCriticalPodAnnotation=true-RotateKubeletServerCertificate=true-SupportPodPidsLimit=true-LocalStorageCapacityIsolation=falseauthConfig:oauthMetadataFile:/etc/kubernetes/static-pod-resources/configmaps/oauth-metadata/oauthMetadatacorsAllowedOrigins:-//127\.0\.0\.1(:|$)-//localhost(:|$)imagePolicyConfig:internalRegistryHostname:image-registry.openshift-image-registry.svc:5000servicesSubnet:172.30.0.0/16servingInfo:namedCertificates:-certFile:/etc/kubernetes/static-pod-certs/secrets/localhost-serving-cert-certkey/tls.crtkeyFile:/etc/kubernetes/static-pod-certs/secrets/localhost-serving-cert-certkey/tls.key-certFile:/etc/kubernetes/static-pod-certs/secrets/service-network-serving-certkey/tls.crtkeyFile:/etc/kubernetes/static-pod-certs/secrets/service-network-serving-certkey/tls.key-certFile:/etc/kubernetes/static-pod-certs/secrets/external-loadbalancer-serving-certkey/tls.crtkeyFile:/etc/kubernetes/static-pod-certs/secrets/external-loadbalancer-serving-certkey/tls.key-certFile:/etc/kubernetes/static-pod-certs/secrets/internal-loadbalancer-serving-certkey/tls.crtkeyFile:/etc/kubernetes/static-pod-certs/secrets/internal-loadbalancer-serving-certkey/tls.keystorageConfig:urls:-https://etcd-0.example.com:2379-https://etcd-1.example.com:2379-https://etcd-2.example.com:2379operatorLogLevel:''unsupportedConfigOverrides:nullstatus:conditions:-lastTransitionTime:2019-09-09 06:34:21+00:00message:3 nodes are active; 1 nodes are at revision 2; 2 nodes are at revision 5status:'True'type:Available-lastTransitionTime:2019-09-09 06:21:53+00:00message:1 nodes are at revision 2; 2 nodes are at revision 5status:'True'type:ProgressinglatestAvailableRevision:5latestAvailableRevisionReason:''nodeStatuses:-currentRevision:2nodeName:control-plane-1targetRevision:5-currentRevision:5nodeName:control-plane-0-currentRevision:5nodeName:control-plane-2readyReplicas:0
你想知道在最新版本中,哪些节点没有提到节点状态。在
你可以这样做:
defget_stale(resources):results=[]fordocinresources:forstatusindoc.get("status",{}).get("nodeStatuses",[]):if"targetRevision"instatusandstatus["targetRevision"]!=status["currentRevision"]:results.append(doc)returnresultsscheduler=load("scheduler.yaml")cm=load("controller_manager.yaml")api=load("api_server.yaml")stale=get_stale([scheduler,cm,api])
或者你可以这样做:
fromsquerlyimportList,convert,Queryablescheduler=convert(load("scheduler.yaml"))cm=convert(load("controller_manager.yaml"))api=convert(load("api_server.yaml"))docs=Queryable(List([scheduler,cm,api]))stale=docs.status.nodeStatuses.where(lambdas:s.currentRevision!=s.targetRevision).roots
或者更好的方法是运行./analyze.py must-gather.local.12345/
并访问
every存档中的资源:
In[1]:stale=conf.status.nodeStatuses.where(lambdas:s.currentRevision!=s.targetRevision).rootsIn[2]:stale.kindOut[2]:-kind:KubeScheduler-kind:KubeAPIServerIn[3]:conf.find(("message",matches("Perm")))Out[3]:-message:'rm: cannot remove ''/etc/cni/net.d/80-openshift-network.conf'': Permissiondenied'-message:'rm: cannot remove ''/etc/cni/net.d/80-openshift-network.conf'': Permissiondenied'-message:'+ source /run/etcd/environment/bin/sh:line3:/run/etcd/environment:Permissiondenied'In[8]:conf.find(("message",matches("Perm"))).upto("items").metadata.nameOut[8]:-name:sdn-7llq6-name:etcd-member-control-plane-0
- 项目
标签: