123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046 |
- /*
- Copyright 2017 The Kubernetes Authors.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
- package internalversion
- import (
- "bytes"
- "fmt"
- "net"
- "sort"
- "strconv"
- "strings"
- "time"
- appsv1beta1 "k8s.io/api/apps/v1beta1"
- autoscalingv2beta1 "k8s.io/api/autoscaling/v2beta1"
- batchv1 "k8s.io/api/batch/v1"
- batchv1beta1 "k8s.io/api/batch/v1beta1"
- certificatesv1beta1 "k8s.io/api/certificates/v1beta1"
- coordinationv1 "k8s.io/api/coordination/v1"
- apiv1 "k8s.io/api/core/v1"
- extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
- policyv1beta1 "k8s.io/api/policy/v1beta1"
- rbacv1beta1 "k8s.io/api/rbac/v1beta1"
- schedulingv1 "k8s.io/api/scheduling/v1"
- storagev1 "k8s.io/api/storage/v1"
- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
- metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1"
- "k8s.io/apimachinery/pkg/labels"
- "k8s.io/apimachinery/pkg/runtime"
- "k8s.io/apimachinery/pkg/runtime/schema"
- "k8s.io/apimachinery/pkg/util/duration"
- "k8s.io/apimachinery/pkg/util/sets"
- "k8s.io/kubernetes/pkg/apis/apps"
- "k8s.io/kubernetes/pkg/apis/autoscaling"
- "k8s.io/kubernetes/pkg/apis/batch"
- "k8s.io/kubernetes/pkg/apis/certificates"
- "k8s.io/kubernetes/pkg/apis/coordination"
- api "k8s.io/kubernetes/pkg/apis/core"
- "k8s.io/kubernetes/pkg/apis/core/helper"
- "k8s.io/kubernetes/pkg/apis/networking"
- nodeapi "k8s.io/kubernetes/pkg/apis/node"
- "k8s.io/kubernetes/pkg/apis/policy"
- "k8s.io/kubernetes/pkg/apis/rbac"
- "k8s.io/kubernetes/pkg/apis/scheduling"
- "k8s.io/kubernetes/pkg/apis/storage"
- storageutil "k8s.io/kubernetes/pkg/apis/storage/util"
- "k8s.io/kubernetes/pkg/printers"
- "k8s.io/kubernetes/pkg/util/node"
- )
- const (
- loadBalancerWidth = 16
- // labelNodeRolePrefix is a label prefix for node roles
- // It's copied over to here until it's merged in core: https://github.com/kubernetes/kubernetes/pull/39112
- labelNodeRolePrefix = "node-role.kubernetes.io/"
- // nodeLabelRole specifies the role of a node
- nodeLabelRole = "kubernetes.io/role"
- )
- // AddHandlers adds print handlers for default Kubernetes types dealing with internal versions.
- // TODO: handle errors from Handler
- func AddHandlers(h printers.PrintHandler) {
- podColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Ready", Type: "string", Description: "The aggregate readiness state of this pod for accepting traffic."},
- {Name: "Status", Type: "string", Description: "The aggregate status of the containers in this pod."},
- {Name: "Restarts", Type: "integer", Description: "The number of times the containers in this pod have been restarted."},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- {Name: "IP", Type: "string", Priority: 1, Description: apiv1.PodStatus{}.SwaggerDoc()["podIP"]},
- {Name: "Node", Type: "string", Priority: 1, Description: apiv1.PodSpec{}.SwaggerDoc()["nodeName"]},
- {Name: "Nominated Node", Type: "string", Priority: 1, Description: apiv1.PodStatus{}.SwaggerDoc()["nominatedNodeName"]},
- {Name: "Readiness Gates", Type: "string", Priority: 1, Description: apiv1.PodSpec{}.SwaggerDoc()["readinessGates"]},
- }
- h.TableHandler(podColumnDefinitions, printPodList)
- h.TableHandler(podColumnDefinitions, printPod)
- podTemplateColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Containers", Type: "string", Description: "Names of each container in the template."},
- {Name: "Images", Type: "string", Description: "Images referenced by each container in the template."},
- {Name: "Pod Labels", Type: "string", Description: "The labels for the pod template."},
- }
- h.TableHandler(podTemplateColumnDefinitions, printPodTemplate)
- h.TableHandler(podTemplateColumnDefinitions, printPodTemplateList)
- podDisruptionBudgetColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Min Available", Type: "string", Description: "The minimum number of pods that must be available."},
- {Name: "Max Unavailable", Type: "string", Description: "The maximum number of pods that may be unavailable."},
- {Name: "Allowed Disruptions", Type: "integer", Description: "Calculated number of pods that may be disrupted at this time."},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- }
- h.TableHandler(podDisruptionBudgetColumnDefinitions, printPodDisruptionBudget)
- h.TableHandler(podDisruptionBudgetColumnDefinitions, printPodDisruptionBudgetList)
- replicationControllerColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Desired", Type: "integer", Description: apiv1.ReplicationControllerSpec{}.SwaggerDoc()["replicas"]},
- {Name: "Current", Type: "integer", Description: apiv1.ReplicationControllerStatus{}.SwaggerDoc()["replicas"]},
- {Name: "Ready", Type: "integer", Description: apiv1.ReplicationControllerStatus{}.SwaggerDoc()["readyReplicas"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- {Name: "Containers", Type: "string", Priority: 1, Description: "Names of each container in the template."},
- {Name: "Images", Type: "string", Priority: 1, Description: "Images referenced by each container in the template."},
- {Name: "Selector", Type: "string", Priority: 1, Description: apiv1.ReplicationControllerSpec{}.SwaggerDoc()["selector"]},
- }
- h.TableHandler(replicationControllerColumnDefinitions, printReplicationController)
- h.TableHandler(replicationControllerColumnDefinitions, printReplicationControllerList)
- replicaSetColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Desired", Type: "integer", Description: extensionsv1beta1.ReplicaSetSpec{}.SwaggerDoc()["replicas"]},
- {Name: "Current", Type: "integer", Description: extensionsv1beta1.ReplicaSetStatus{}.SwaggerDoc()["replicas"]},
- {Name: "Ready", Type: "integer", Description: extensionsv1beta1.ReplicaSetStatus{}.SwaggerDoc()["readyReplicas"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- {Name: "Containers", Type: "string", Priority: 1, Description: "Names of each container in the template."},
- {Name: "Images", Type: "string", Priority: 1, Description: "Images referenced by each container in the template."},
- {Name: "Selector", Type: "string", Priority: 1, Description: extensionsv1beta1.ReplicaSetSpec{}.SwaggerDoc()["selector"]},
- }
- h.TableHandler(replicaSetColumnDefinitions, printReplicaSet)
- h.TableHandler(replicaSetColumnDefinitions, printReplicaSetList)
- daemonSetColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Desired", Type: "integer", Description: extensionsv1beta1.DaemonSetStatus{}.SwaggerDoc()["desiredNumberScheduled"]},
- {Name: "Current", Type: "integer", Description: extensionsv1beta1.DaemonSetStatus{}.SwaggerDoc()["currentNumberScheduled"]},
- {Name: "Ready", Type: "integer", Description: extensionsv1beta1.DaemonSetStatus{}.SwaggerDoc()["numberReady"]},
- {Name: "Up-to-date", Type: "integer", Description: extensionsv1beta1.DaemonSetStatus{}.SwaggerDoc()["updatedNumberScheduled"]},
- {Name: "Available", Type: "integer", Description: extensionsv1beta1.DaemonSetStatus{}.SwaggerDoc()["numberAvailable"]},
- {Name: "Node Selector", Type: "string", Description: apiv1.PodSpec{}.SwaggerDoc()["nodeSelector"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- {Name: "Containers", Type: "string", Priority: 1, Description: "Names of each container in the template."},
- {Name: "Images", Type: "string", Priority: 1, Description: "Images referenced by each container in the template."},
- {Name: "Selector", Type: "string", Priority: 1, Description: extensionsv1beta1.DaemonSetSpec{}.SwaggerDoc()["selector"]},
- }
- h.TableHandler(daemonSetColumnDefinitions, printDaemonSet)
- h.TableHandler(daemonSetColumnDefinitions, printDaemonSetList)
- jobColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Completions", Type: "string", Description: batchv1.JobStatus{}.SwaggerDoc()["succeeded"]},
- {Name: "Duration", Type: "string", Description: "Time required to complete the job."},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- {Name: "Containers", Type: "string", Priority: 1, Description: "Names of each container in the template."},
- {Name: "Images", Type: "string", Priority: 1, Description: "Images referenced by each container in the template."},
- {Name: "Selector", Type: "string", Priority: 1, Description: batchv1.JobSpec{}.SwaggerDoc()["selector"]},
- }
- h.TableHandler(jobColumnDefinitions, printJob)
- h.TableHandler(jobColumnDefinitions, printJobList)
- cronJobColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Schedule", Type: "string", Description: batchv1beta1.CronJobSpec{}.SwaggerDoc()["schedule"]},
- {Name: "Suspend", Type: "boolean", Description: batchv1beta1.CronJobSpec{}.SwaggerDoc()["suspend"]},
- {Name: "Active", Type: "integer", Description: batchv1beta1.CronJobStatus{}.SwaggerDoc()["active"]},
- {Name: "Last Schedule", Type: "string", Description: batchv1beta1.CronJobStatus{}.SwaggerDoc()["lastScheduleTime"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- {Name: "Containers", Type: "string", Priority: 1, Description: "Names of each container in the template."},
- {Name: "Images", Type: "string", Priority: 1, Description: "Images referenced by each container in the template."},
- {Name: "Selector", Type: "string", Priority: 1, Description: batchv1.JobSpec{}.SwaggerDoc()["selector"]},
- }
- h.TableHandler(cronJobColumnDefinitions, printCronJob)
- h.TableHandler(cronJobColumnDefinitions, printCronJobList)
- serviceColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Type", Type: "string", Description: apiv1.ServiceSpec{}.SwaggerDoc()["type"]},
- {Name: "Cluster-IP", Type: "string", Description: apiv1.ServiceSpec{}.SwaggerDoc()["clusterIP"]},
- {Name: "External-IP", Type: "string", Description: apiv1.ServiceSpec{}.SwaggerDoc()["externalIPs"]},
- {Name: "Port(s)", Type: "string", Description: apiv1.ServiceSpec{}.SwaggerDoc()["ports"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- {Name: "Selector", Type: "string", Priority: 1, Description: apiv1.ServiceSpec{}.SwaggerDoc()["selector"]},
- }
- h.TableHandler(serviceColumnDefinitions, printService)
- h.TableHandler(serviceColumnDefinitions, printServiceList)
- ingressColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Hosts", Type: "string", Description: "Hosts that incoming requests are matched against before the ingress rule"},
- {Name: "Address", Type: "string", Description: "Address is a list containing ingress points for the load-balancer"},
- {Name: "Ports", Type: "string", Description: "Ports of TLS configurations that open"},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- }
- h.TableHandler(ingressColumnDefinitions, printIngress)
- h.TableHandler(ingressColumnDefinitions, printIngressList)
- statefulSetColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Ready", Type: "string", Description: "Number of the pod with ready state"},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- {Name: "Containers", Type: "string", Priority: 1, Description: "Names of each container in the template."},
- {Name: "Images", Type: "string", Priority: 1, Description: "Images referenced by each container in the template."},
- }
- h.TableHandler(statefulSetColumnDefinitions, printStatefulSet)
- h.TableHandler(statefulSetColumnDefinitions, printStatefulSetList)
- endpointColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Endpoints", Type: "string", Description: apiv1.Endpoints{}.SwaggerDoc()["subsets"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- }
- h.TableHandler(endpointColumnDefinitions, printEndpoints)
- h.TableHandler(endpointColumnDefinitions, printEndpointsList)
- nodeColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Status", Type: "string", Description: "The status of the node"},
- {Name: "Roles", Type: "string", Description: "The roles of the node"},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- {Name: "Version", Type: "string", Description: apiv1.NodeSystemInfo{}.SwaggerDoc()["kubeletVersion"]},
- {Name: "Internal-IP", Type: "string", Priority: 1, Description: apiv1.NodeStatus{}.SwaggerDoc()["addresses"]},
- {Name: "External-IP", Type: "string", Priority: 1, Description: apiv1.NodeStatus{}.SwaggerDoc()["addresses"]},
- {Name: "OS-Image", Type: "string", Priority: 1, Description: apiv1.NodeSystemInfo{}.SwaggerDoc()["osImage"]},
- {Name: "Kernel-Version", Type: "string", Priority: 1, Description: apiv1.NodeSystemInfo{}.SwaggerDoc()["kernelVersion"]},
- {Name: "Container-Runtime", Type: "string", Priority: 1, Description: apiv1.NodeSystemInfo{}.SwaggerDoc()["containerRuntimeVersion"]},
- }
- h.TableHandler(nodeColumnDefinitions, printNode)
- h.TableHandler(nodeColumnDefinitions, printNodeList)
- eventColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Last Seen", Type: "string", Description: apiv1.Event{}.SwaggerDoc()["lastTimestamp"]},
- {Name: "Type", Type: "string", Description: apiv1.Event{}.SwaggerDoc()["type"]},
- {Name: "Reason", Type: "string", Description: apiv1.Event{}.SwaggerDoc()["reason"]},
- {Name: "Object", Type: "string", Description: apiv1.Event{}.SwaggerDoc()["involvedObject"]},
- {Name: "Subobject", Type: "string", Priority: 1, Description: apiv1.Event{}.InvolvedObject.SwaggerDoc()["fieldPath"]},
- {Name: "Source", Type: "string", Priority: 1, Description: apiv1.Event{}.SwaggerDoc()["source"]},
- {Name: "Message", Type: "string", Description: apiv1.Event{}.SwaggerDoc()["message"]},
- {Name: "First Seen", Type: "string", Priority: 1, Description: apiv1.Event{}.SwaggerDoc()["firstTimestamp"]},
- {Name: "Count", Type: "string", Priority: 1, Description: apiv1.Event{}.SwaggerDoc()["count"]},
- {Name: "Name", Type: "string", Priority: 1, Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- }
- h.TableHandler(eventColumnDefinitions, printEvent)
- h.TableHandler(eventColumnDefinitions, printEventList)
- namespaceColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Status", Type: "string", Description: "The status of the namespace"},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- }
- h.TableHandler(namespaceColumnDefinitions, printNamespace)
- h.TableHandler(namespaceColumnDefinitions, printNamespaceList)
- secretColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Type", Type: "string", Description: apiv1.Secret{}.SwaggerDoc()["type"]},
- {Name: "Data", Type: "string", Description: apiv1.Secret{}.SwaggerDoc()["data"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- }
- h.TableHandler(secretColumnDefinitions, printSecret)
- h.TableHandler(secretColumnDefinitions, printSecretList)
- serviceAccountColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Secrets", Type: "string", Description: apiv1.ServiceAccount{}.SwaggerDoc()["secrets"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- }
- h.TableHandler(serviceAccountColumnDefinitions, printServiceAccount)
- h.TableHandler(serviceAccountColumnDefinitions, printServiceAccountList)
- persistentVolumeColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Capacity", Type: "string", Description: apiv1.PersistentVolumeSpec{}.SwaggerDoc()["capacity"]},
- {Name: "Access Modes", Type: "string", Description: apiv1.PersistentVolumeSpec{}.SwaggerDoc()["accessModes"]},
- {Name: "Reclaim Policy", Type: "string", Description: apiv1.PersistentVolumeSpec{}.SwaggerDoc()["persistentVolumeReclaimPolicy"]},
- {Name: "Status", Type: "string", Description: apiv1.PersistentVolumeStatus{}.SwaggerDoc()["phase"]},
- {Name: "Claim", Type: "string", Description: apiv1.PersistentVolumeSpec{}.SwaggerDoc()["claimRef"]},
- {Name: "StorageClass", Type: "string", Description: "StorageClass of the pv"},
- {Name: "Reason", Type: "string", Description: apiv1.PersistentVolumeStatus{}.SwaggerDoc()["reason"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- {Name: "VolumeMode", Type: "string", Priority: 1, Description: apiv1.PersistentVolumeSpec{}.SwaggerDoc()["volumeMode"]},
- }
- h.TableHandler(persistentVolumeColumnDefinitions, printPersistentVolume)
- h.TableHandler(persistentVolumeColumnDefinitions, printPersistentVolumeList)
- persistentVolumeClaimColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Status", Type: "string", Description: apiv1.PersistentVolumeClaimStatus{}.SwaggerDoc()["phase"]},
- {Name: "Volume", Type: "string", Description: apiv1.PersistentVolumeClaimSpec{}.SwaggerDoc()["volumeName"]},
- {Name: "Capacity", Type: "string", Description: apiv1.PersistentVolumeClaimStatus{}.SwaggerDoc()["capacity"]},
- {Name: "Access Modes", Type: "string", Description: apiv1.PersistentVolumeClaimStatus{}.SwaggerDoc()["accessModes"]},
- {Name: "StorageClass", Type: "string", Description: "StorageClass of the pvc"},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- {Name: "VolumeMode", Type: "string", Priority: 1, Description: apiv1.PersistentVolumeClaimSpec{}.SwaggerDoc()["volumeMode"]},
- }
- h.TableHandler(persistentVolumeClaimColumnDefinitions, printPersistentVolumeClaim)
- h.TableHandler(persistentVolumeClaimColumnDefinitions, printPersistentVolumeClaimList)
- componentStatusColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Status", Type: "string", Description: "Status of the component conditions"},
- {Name: "Message", Type: "string", Description: "Message of the component conditions"},
- {Name: "Error", Type: "string", Description: "Error of the component conditions"},
- }
- h.TableHandler(componentStatusColumnDefinitions, printComponentStatus)
- h.TableHandler(componentStatusColumnDefinitions, printComponentStatusList)
- deploymentColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Ready", Type: "string", Description: "Number of the pod with ready state"},
- {Name: "Up-to-date", Type: "string", Description: extensionsv1beta1.DeploymentStatus{}.SwaggerDoc()["updatedReplicas"]},
- {Name: "Available", Type: "string", Description: extensionsv1beta1.DeploymentStatus{}.SwaggerDoc()["availableReplicas"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- {Name: "Containers", Type: "string", Priority: 1, Description: "Names of each container in the template."},
- {Name: "Images", Type: "string", Priority: 1, Description: "Images referenced by each container in the template."},
- {Name: "Selector", Type: "string", Priority: 1, Description: extensionsv1beta1.DeploymentSpec{}.SwaggerDoc()["selector"]},
- }
- h.TableHandler(deploymentColumnDefinitions, printDeployment)
- h.TableHandler(deploymentColumnDefinitions, printDeploymentList)
- horizontalPodAutoscalerColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Reference", Type: "string", Description: autoscalingv2beta1.HorizontalPodAutoscalerSpec{}.SwaggerDoc()["scaleTargetRef"]},
- {Name: "Targets", Type: "string", Description: autoscalingv2beta1.HorizontalPodAutoscalerSpec{}.SwaggerDoc()["metrics"]},
- {Name: "MinPods", Type: "string", Description: autoscalingv2beta1.HorizontalPodAutoscalerSpec{}.SwaggerDoc()["minReplicas"]},
- {Name: "MaxPods", Type: "string", Description: autoscalingv2beta1.HorizontalPodAutoscalerSpec{}.SwaggerDoc()["maxReplicas"]},
- {Name: "Replicas", Type: "string", Description: autoscalingv2beta1.HorizontalPodAutoscalerStatus{}.SwaggerDoc()["currentReplicas"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- }
- h.TableHandler(horizontalPodAutoscalerColumnDefinitions, printHorizontalPodAutoscaler)
- h.TableHandler(horizontalPodAutoscalerColumnDefinitions, printHorizontalPodAutoscalerList)
- configMapColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Data", Type: "string", Description: apiv1.ConfigMap{}.SwaggerDoc()["data"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- }
- h.TableHandler(configMapColumnDefinitions, printConfigMap)
- h.TableHandler(configMapColumnDefinitions, printConfigMapList)
- podSecurityPolicyColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Priv", Type: "string", Description: policyv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["privileged"]},
- {Name: "Caps", Type: "string", Description: policyv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["allowedCapabilities"]},
- {Name: "SELinux", Type: "string", Description: policyv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["seLinux"]},
- {Name: "RunAsUser", Type: "string", Description: policyv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["runAsUser"]},
- {Name: "FsGroup", Type: "string", Description: policyv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["fsGroup"]},
- {Name: "SupGroup", Type: "string", Description: policyv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["supplementalGroups"]},
- {Name: "ReadOnlyRootFs", Type: "string", Description: policyv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["readOnlyRootFilesystem"]},
- {Name: "Volumes", Type: "string", Description: policyv1beta1.PodSecurityPolicySpec{}.SwaggerDoc()["volumes"]},
- }
- h.TableHandler(podSecurityPolicyColumnDefinitions, printPodSecurityPolicy)
- h.TableHandler(podSecurityPolicyColumnDefinitions, printPodSecurityPolicyList)
- networkPolicyColumnDefinitioins := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Pod-Selector", Type: "string", Description: extensionsv1beta1.NetworkPolicySpec{}.SwaggerDoc()["podSelector"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- }
- h.TableHandler(networkPolicyColumnDefinitioins, printNetworkPolicy)
- h.TableHandler(networkPolicyColumnDefinitioins, printNetworkPolicyList)
- roleBindingsColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- {Name: "Role", Type: "string", Priority: 1, Description: rbacv1beta1.RoleBinding{}.SwaggerDoc()["roleRef"]},
- {Name: "Users", Type: "string", Priority: 1, Description: "Users in the roleBinding"},
- {Name: "Groups", Type: "string", Priority: 1, Description: "Groups in the roleBinding"},
- {Name: "ServiceAccounts", Type: "string", Priority: 1, Description: "ServiceAccounts in the roleBinding"},
- }
- h.TableHandler(roleBindingsColumnDefinitions, printRoleBinding)
- h.TableHandler(roleBindingsColumnDefinitions, printRoleBindingList)
- clusterRoleBindingsColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- {Name: "Role", Type: "string", Priority: 1, Description: rbacv1beta1.ClusterRoleBinding{}.SwaggerDoc()["roleRef"]},
- {Name: "Users", Type: "string", Priority: 1, Description: "Users in the clusterRoleBinding"},
- {Name: "Groups", Type: "string", Priority: 1, Description: "Groups in the clusterRoleBinding"},
- {Name: "ServiceAccounts", Type: "string", Priority: 1, Description: "ServiceAccounts in the clusterRoleBinding"},
- }
- h.TableHandler(clusterRoleBindingsColumnDefinitions, printClusterRoleBinding)
- h.TableHandler(clusterRoleBindingsColumnDefinitions, printClusterRoleBindingList)
- certificateSigningRequestColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- {Name: "Requestor", Type: "string", Description: certificatesv1beta1.CertificateSigningRequestSpec{}.SwaggerDoc()["request"]},
- {Name: "Condition", Type: "string", Description: certificatesv1beta1.CertificateSigningRequestStatus{}.SwaggerDoc()["conditions"]},
- }
- h.TableHandler(certificateSigningRequestColumnDefinitions, printCertificateSigningRequest)
- h.TableHandler(certificateSigningRequestColumnDefinitions, printCertificateSigningRequestList)
- leaseColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Holder", Type: "string", Description: coordinationv1.LeaseSpec{}.SwaggerDoc()["holderIdentity"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- }
- h.TableHandler(leaseColumnDefinitions, printLease)
- h.TableHandler(leaseColumnDefinitions, printLeaseList)
- storageClassColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Provisioner", Type: "string", Description: storagev1.StorageClass{}.SwaggerDoc()["provisioner"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- }
- h.TableHandler(storageClassColumnDefinitions, printStorageClass)
- h.TableHandler(storageClassColumnDefinitions, printStorageClassList)
- statusColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Status", Type: "string", Description: metav1.Status{}.SwaggerDoc()["status"]},
- {Name: "Reason", Type: "string", Description: metav1.Status{}.SwaggerDoc()["reason"]},
- {Name: "Message", Type: "string", Description: metav1.Status{}.SwaggerDoc()["Message"]},
- }
- h.TableHandler(statusColumnDefinitions, printStatus)
- controllerRevisionColumnDefinition := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Controller", Type: "string", Description: "Controller of the object"},
- {Name: "Revision", Type: "string", Description: appsv1beta1.ControllerRevision{}.SwaggerDoc()["revision"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- }
- h.TableHandler(controllerRevisionColumnDefinition, printControllerRevision)
- h.TableHandler(controllerRevisionColumnDefinition, printControllerRevisionList)
- resourceQuotaColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- {Name: "Request", Type: "string", Description: "Request represents a minimum amount of cpu/memory that a container may consume."},
- {Name: "Limit", Type: "string", Description: "Limits control the maximum amount of cpu/memory that a container may use independent of contention on the node."},
- }
- h.TableHandler(resourceQuotaColumnDefinitions, printResourceQuota)
- h.TableHandler(resourceQuotaColumnDefinitions, printResourceQuotaList)
- priorityClassColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Value", Type: "integer", Description: schedulingv1.PriorityClass{}.SwaggerDoc()["value"]},
- {Name: "Global-Default", Type: "boolean", Description: schedulingv1.PriorityClass{}.SwaggerDoc()["globalDefault"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- }
- h.TableHandler(priorityClassColumnDefinitions, printPriorityClass)
- h.TableHandler(priorityClassColumnDefinitions, printPriorityClassList)
- runtimeClassColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Handler", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["handler"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- }
- h.TableHandler(runtimeClassColumnDefinitions, printRuntimeClass)
- h.TableHandler(runtimeClassColumnDefinitions, printRuntimeClassList)
- volumeAttachmentColumnDefinitions := []metav1beta1.TableColumnDefinition{
- {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
- {Name: "Attacher", Type: "string", Format: "name", Description: storagev1.VolumeAttachmentSpec{}.SwaggerDoc()["attacher"]},
- {Name: "PV", Type: "string", Description: storagev1.VolumeAttachmentSource{}.SwaggerDoc()["persistentVolumeName"]},
- {Name: "Node", Type: "string", Description: storagev1.VolumeAttachmentSpec{}.SwaggerDoc()["nodeName"]},
- {Name: "Attached", Type: "boolean", Description: storagev1.VolumeAttachmentStatus{}.SwaggerDoc()["attached"]},
- {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
- }
- h.TableHandler(volumeAttachmentColumnDefinitions, printVolumeAttachment)
- h.TableHandler(volumeAttachmentColumnDefinitions, printVolumeAttachmentList)
- }
- // Pass ports=nil for all ports.
- func formatEndpoints(endpoints *api.Endpoints, ports sets.String) string {
- if len(endpoints.Subsets) == 0 {
- return "<none>"
- }
- list := []string{}
- max := 3
- more := false
- count := 0
- for i := range endpoints.Subsets {
- ss := &endpoints.Subsets[i]
- if len(ss.Ports) == 0 {
- // It's possible to have headless services with no ports.
- for i := range ss.Addresses {
- if len(list) == max {
- more = true
- }
- if !more {
- list = append(list, ss.Addresses[i].IP)
- }
- count++
- }
- } else {
- // "Normal" services with ports defined.
- for i := range ss.Ports {
- port := &ss.Ports[i]
- if ports == nil || ports.Has(port.Name) {
- for i := range ss.Addresses {
- if len(list) == max {
- more = true
- }
- addr := &ss.Addresses[i]
- if !more {
- hostPort := net.JoinHostPort(addr.IP, strconv.Itoa(int(port.Port)))
- list = append(list, hostPort)
- }
- count++
- }
- }
- }
- }
- }
- ret := strings.Join(list, ",")
- if more {
- return fmt.Sprintf("%s + %d more...", ret, count-max)
- }
- return ret
- }
- // translateTimestampSince returns the elapsed time since timestamp in
- // human-readable approximation.
- func translateTimestampSince(timestamp metav1.Time) string {
- if timestamp.IsZero() {
- return "<unknown>"
- }
- return duration.HumanDuration(time.Since(timestamp.Time))
- }
- // translateTimestampUntil returns the elapsed time until timestamp in
- // human-readable approximation.
- func translateTimestampUntil(timestamp metav1.Time) string {
- if timestamp.IsZero() {
- return "<unknown>"
- }
- return duration.HumanDuration(time.Until(timestamp.Time))
- }
- var (
- podSuccessConditions = []metav1.TableRowCondition{{Type: metav1.RowCompleted, Status: metav1.ConditionTrue, Reason: string(api.PodSucceeded), Message: "The pod has completed successfully."}}
- podFailedConditions = []metav1.TableRowCondition{{Type: metav1.RowCompleted, Status: metav1.ConditionTrue, Reason: string(api.PodFailed), Message: "The pod failed."}}
- )
- func printPodList(podList *api.PodList, options printers.PrintOptions) ([]metav1.TableRow, error) {
- rows := make([]metav1.TableRow, 0, len(podList.Items))
- for i := range podList.Items {
- r, err := printPod(&podList.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printPod(pod *api.Pod, options printers.PrintOptions) ([]metav1.TableRow, error) {
- restarts := 0
- totalContainers := len(pod.Spec.Containers)
- readyContainers := 0
- reason := string(pod.Status.Phase)
- if pod.Status.Reason != "" {
- reason = pod.Status.Reason
- }
- row := metav1.TableRow{
- Object: runtime.RawExtension{Object: pod},
- }
- switch pod.Status.Phase {
- case api.PodSucceeded:
- row.Conditions = podSuccessConditions
- case api.PodFailed:
- row.Conditions = podFailedConditions
- }
- initializing := false
- for i := range pod.Status.InitContainerStatuses {
- container := pod.Status.InitContainerStatuses[i]
- restarts += int(container.RestartCount)
- switch {
- case container.State.Terminated != nil && container.State.Terminated.ExitCode == 0:
- continue
- case container.State.Terminated != nil:
- // initialization is failed
- if len(container.State.Terminated.Reason) == 0 {
- if container.State.Terminated.Signal != 0 {
- reason = fmt.Sprintf("Init:Signal:%d", container.State.Terminated.Signal)
- } else {
- reason = fmt.Sprintf("Init:ExitCode:%d", container.State.Terminated.ExitCode)
- }
- } else {
- reason = "Init:" + container.State.Terminated.Reason
- }
- initializing = true
- case container.State.Waiting != nil && len(container.State.Waiting.Reason) > 0 && container.State.Waiting.Reason != "PodInitializing":
- reason = "Init:" + container.State.Waiting.Reason
- initializing = true
- default:
- reason = fmt.Sprintf("Init:%d/%d", i, len(pod.Spec.InitContainers))
- initializing = true
- }
- break
- }
- if !initializing {
- restarts = 0
- hasRunning := false
- for i := len(pod.Status.ContainerStatuses) - 1; i >= 0; i-- {
- container := pod.Status.ContainerStatuses[i]
- restarts += int(container.RestartCount)
- if container.State.Waiting != nil && container.State.Waiting.Reason != "" {
- reason = container.State.Waiting.Reason
- } else if container.State.Terminated != nil && container.State.Terminated.Reason != "" {
- reason = container.State.Terminated.Reason
- } else if container.State.Terminated != nil && container.State.Terminated.Reason == "" {
- if container.State.Terminated.Signal != 0 {
- reason = fmt.Sprintf("Signal:%d", container.State.Terminated.Signal)
- } else {
- reason = fmt.Sprintf("ExitCode:%d", container.State.Terminated.ExitCode)
- }
- } else if container.Ready && container.State.Running != nil {
- hasRunning = true
- readyContainers++
- }
- }
- // change pod status back to "Running" if there is at least one container still reporting as "Running" status
- if reason == "Completed" && hasRunning {
- reason = "Running"
- }
- }
- if pod.DeletionTimestamp != nil && pod.Status.Reason == node.NodeUnreachablePodReason {
- reason = "Unknown"
- } else if pod.DeletionTimestamp != nil {
- reason = "Terminating"
- }
- row.Cells = append(row.Cells, pod.Name, fmt.Sprintf("%d/%d", readyContainers, totalContainers), reason, int64(restarts), translateTimestampSince(pod.CreationTimestamp))
- if options.Wide {
- nodeName := pod.Spec.NodeName
- nominatedNodeName := pod.Status.NominatedNodeName
- podIP := pod.Status.PodIP
- if podIP == "" {
- podIP = "<none>"
- }
- if nodeName == "" {
- nodeName = "<none>"
- }
- if nominatedNodeName == "" {
- nominatedNodeName = "<none>"
- }
- readinessGates := "<none>"
- if len(pod.Spec.ReadinessGates) > 0 {
- trueConditions := 0
- for _, readinessGate := range pod.Spec.ReadinessGates {
- conditionType := readinessGate.ConditionType
- for _, condition := range pod.Status.Conditions {
- if condition.Type == conditionType {
- if condition.Status == api.ConditionTrue {
- trueConditions++
- }
- break
- }
- }
- }
- readinessGates = fmt.Sprintf("%d/%d", trueConditions, len(pod.Spec.ReadinessGates))
- }
- row.Cells = append(row.Cells, podIP, nodeName, nominatedNodeName, readinessGates)
- }
- return []metav1beta1.TableRow{row}, nil
- }
- func printPodTemplate(obj *api.PodTemplate, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- names, images := layoutContainerCells(obj.Template.Spec.Containers)
- row.Cells = append(row.Cells, obj.Name, names, images, labels.FormatLabels(obj.Template.Labels))
- return []metav1beta1.TableRow{row}, nil
- }
- func printPodTemplateList(list *api.PodTemplateList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printPodTemplate(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printPodDisruptionBudget(obj *policy.PodDisruptionBudget, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- var minAvailable string
- var maxUnavailable string
- if obj.Spec.MinAvailable != nil {
- minAvailable = obj.Spec.MinAvailable.String()
- } else {
- minAvailable = "N/A"
- }
- if obj.Spec.MaxUnavailable != nil {
- maxUnavailable = obj.Spec.MaxUnavailable.String()
- } else {
- maxUnavailable = "N/A"
- }
- row.Cells = append(row.Cells, obj.Name, minAvailable, maxUnavailable, int64(obj.Status.PodDisruptionsAllowed), translateTimestampSince(obj.CreationTimestamp))
- return []metav1beta1.TableRow{row}, nil
- }
- func printPodDisruptionBudgetList(list *policy.PodDisruptionBudgetList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printPodDisruptionBudget(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- // TODO(AdoHe): try to put wide output in a single method
- func printReplicationController(obj *api.ReplicationController, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- desiredReplicas := obj.Spec.Replicas
- currentReplicas := obj.Status.Replicas
- readyReplicas := obj.Status.ReadyReplicas
- row.Cells = append(row.Cells, obj.Name, int64(desiredReplicas), int64(currentReplicas), int64(readyReplicas), translateTimestampSince(obj.CreationTimestamp))
- if options.Wide {
- names, images := layoutContainerCells(obj.Spec.Template.Spec.Containers)
- row.Cells = append(row.Cells, names, images, labels.FormatLabels(obj.Spec.Selector))
- }
- return []metav1beta1.TableRow{row}, nil
- }
- func printReplicationControllerList(list *api.ReplicationControllerList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printReplicationController(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printReplicaSet(obj *apps.ReplicaSet, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- desiredReplicas := obj.Spec.Replicas
- currentReplicas := obj.Status.Replicas
- readyReplicas := obj.Status.ReadyReplicas
- row.Cells = append(row.Cells, obj.Name, int64(desiredReplicas), int64(currentReplicas), int64(readyReplicas), translateTimestampSince(obj.CreationTimestamp))
- if options.Wide {
- names, images := layoutContainerCells(obj.Spec.Template.Spec.Containers)
- row.Cells = append(row.Cells, names, images, metav1.FormatLabelSelector(obj.Spec.Selector))
- }
- return []metav1beta1.TableRow{row}, nil
- }
- func printReplicaSetList(list *apps.ReplicaSetList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printReplicaSet(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printJob(obj *batch.Job, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- var completions string
- if obj.Spec.Completions != nil {
- completions = fmt.Sprintf("%d/%d", obj.Status.Succeeded, *obj.Spec.Completions)
- } else {
- parallelism := int32(0)
- if obj.Spec.Parallelism != nil {
- parallelism = *obj.Spec.Parallelism
- }
- if parallelism > 1 {
- completions = fmt.Sprintf("%d/1 of %d", obj.Status.Succeeded, parallelism)
- } else {
- completions = fmt.Sprintf("%d/1", obj.Status.Succeeded)
- }
- }
- var jobDuration string
- switch {
- case obj.Status.StartTime == nil:
- case obj.Status.CompletionTime == nil:
- jobDuration = duration.HumanDuration(time.Since(obj.Status.StartTime.Time))
- default:
- jobDuration = duration.HumanDuration(obj.Status.CompletionTime.Sub(obj.Status.StartTime.Time))
- }
- row.Cells = append(row.Cells, obj.Name, completions, jobDuration, translateTimestampSince(obj.CreationTimestamp))
- if options.Wide {
- names, images := layoutContainerCells(obj.Spec.Template.Spec.Containers)
- row.Cells = append(row.Cells, names, images, metav1.FormatLabelSelector(obj.Spec.Selector))
- }
- return []metav1beta1.TableRow{row}, nil
- }
- func printJobList(list *batch.JobList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printJob(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printCronJob(obj *batch.CronJob, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- lastScheduleTime := "<none>"
- if obj.Status.LastScheduleTime != nil {
- lastScheduleTime = translateTimestampSince(*obj.Status.LastScheduleTime)
- }
- row.Cells = append(row.Cells, obj.Name, obj.Spec.Schedule, printBoolPtr(obj.Spec.Suspend), int64(len(obj.Status.Active)), lastScheduleTime, translateTimestampSince(obj.CreationTimestamp))
- if options.Wide {
- names, images := layoutContainerCells(obj.Spec.JobTemplate.Spec.Template.Spec.Containers)
- row.Cells = append(row.Cells, names, images, metav1.FormatLabelSelector(obj.Spec.JobTemplate.Spec.Selector))
- }
- return []metav1beta1.TableRow{row}, nil
- }
- func printCronJobList(list *batch.CronJobList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printCronJob(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- // loadBalancerStatusStringer behaves mostly like a string interface and converts the given status to a string.
- // `wide` indicates whether the returned value is meant for --o=wide output. If not, it's clipped to 16 bytes.
- func loadBalancerStatusStringer(s api.LoadBalancerStatus, wide bool) string {
- ingress := s.Ingress
- result := sets.NewString()
- for i := range ingress {
- if ingress[i].IP != "" {
- result.Insert(ingress[i].IP)
- } else if ingress[i].Hostname != "" {
- result.Insert(ingress[i].Hostname)
- }
- }
- r := strings.Join(result.List(), ",")
- if !wide && len(r) > loadBalancerWidth {
- r = r[0:(loadBalancerWidth-3)] + "..."
- }
- return r
- }
- func getServiceExternalIP(svc *api.Service, wide bool) string {
- switch svc.Spec.Type {
- case api.ServiceTypeClusterIP:
- if len(svc.Spec.ExternalIPs) > 0 {
- return strings.Join(svc.Spec.ExternalIPs, ",")
- }
- return "<none>"
- case api.ServiceTypeNodePort:
- if len(svc.Spec.ExternalIPs) > 0 {
- return strings.Join(svc.Spec.ExternalIPs, ",")
- }
- return "<none>"
- case api.ServiceTypeLoadBalancer:
- lbIps := loadBalancerStatusStringer(svc.Status.LoadBalancer, wide)
- if len(svc.Spec.ExternalIPs) > 0 {
- results := []string{}
- if len(lbIps) > 0 {
- results = append(results, strings.Split(lbIps, ",")...)
- }
- results = append(results, svc.Spec.ExternalIPs...)
- return strings.Join(results, ",")
- }
- if len(lbIps) > 0 {
- return lbIps
- }
- return "<pending>"
- case api.ServiceTypeExternalName:
- return svc.Spec.ExternalName
- }
- return "<unknown>"
- }
- func makePortString(ports []api.ServicePort) string {
- pieces := make([]string, len(ports))
- for ix := range ports {
- port := &ports[ix]
- pieces[ix] = fmt.Sprintf("%d/%s", port.Port, port.Protocol)
- if port.NodePort > 0 {
- pieces[ix] = fmt.Sprintf("%d:%d/%s", port.Port, port.NodePort, port.Protocol)
- }
- }
- return strings.Join(pieces, ",")
- }
- func printService(obj *api.Service, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- svcType := obj.Spec.Type
- internalIP := obj.Spec.ClusterIP
- if len(internalIP) == 0 {
- internalIP = "<none>"
- }
- externalIP := getServiceExternalIP(obj, options.Wide)
- svcPorts := makePortString(obj.Spec.Ports)
- if len(svcPorts) == 0 {
- svcPorts = "<none>"
- }
- row.Cells = append(row.Cells, obj.Name, string(svcType), internalIP, externalIP, svcPorts, translateTimestampSince(obj.CreationTimestamp))
- if options.Wide {
- row.Cells = append(row.Cells, labels.FormatLabels(obj.Spec.Selector))
- }
- return []metav1beta1.TableRow{row}, nil
- }
- func printServiceList(list *api.ServiceList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printService(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func formatHosts(rules []networking.IngressRule) string {
- list := []string{}
- max := 3
- more := false
- for _, rule := range rules {
- if len(list) == max {
- more = true
- }
- if !more && len(rule.Host) != 0 {
- list = append(list, rule.Host)
- }
- }
- if len(list) == 0 {
- return "*"
- }
- ret := strings.Join(list, ",")
- if more {
- return fmt.Sprintf("%s + %d more...", ret, len(rules)-max)
- }
- return ret
- }
- func formatPorts(tls []networking.IngressTLS) string {
- if len(tls) != 0 {
- return "80, 443"
- }
- return "80"
- }
- func printIngress(obj *networking.Ingress, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- hosts := formatHosts(obj.Spec.Rules)
- address := loadBalancerStatusStringer(obj.Status.LoadBalancer, options.Wide)
- ports := formatPorts(obj.Spec.TLS)
- createTime := translateTimestampSince(obj.CreationTimestamp)
- row.Cells = append(row.Cells, obj.Name, hosts, address, ports, createTime)
- return []metav1beta1.TableRow{row}, nil
- }
- func printIngressList(list *networking.IngressList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printIngress(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printStatefulSet(obj *apps.StatefulSet, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- desiredReplicas := obj.Spec.Replicas
- readyReplicas := obj.Status.ReadyReplicas
- createTime := translateTimestampSince(obj.CreationTimestamp)
- row.Cells = append(row.Cells, obj.Name, fmt.Sprintf("%d/%d", int64(readyReplicas), int64(desiredReplicas)), createTime)
- if options.Wide {
- names, images := layoutContainerCells(obj.Spec.Template.Spec.Containers)
- row.Cells = append(row.Cells, names, images)
- }
- return []metav1beta1.TableRow{row}, nil
- }
- func printStatefulSetList(list *apps.StatefulSetList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printStatefulSet(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printDaemonSet(obj *apps.DaemonSet, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- desiredScheduled := obj.Status.DesiredNumberScheduled
- currentScheduled := obj.Status.CurrentNumberScheduled
- numberReady := obj.Status.NumberReady
- numberUpdated := obj.Status.UpdatedNumberScheduled
- numberAvailable := obj.Status.NumberAvailable
- row.Cells = append(row.Cells, obj.Name, int64(desiredScheduled), int64(currentScheduled), int64(numberReady), int64(numberUpdated), int64(numberAvailable), labels.FormatLabels(obj.Spec.Template.Spec.NodeSelector), translateTimestampSince(obj.CreationTimestamp))
- if options.Wide {
- names, images := layoutContainerCells(obj.Spec.Template.Spec.Containers)
- row.Cells = append(row.Cells, names, images, metav1.FormatLabelSelector(obj.Spec.Selector))
- }
- return []metav1beta1.TableRow{row}, nil
- }
- func printDaemonSetList(list *apps.DaemonSetList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printDaemonSet(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printEndpoints(obj *api.Endpoints, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- row.Cells = append(row.Cells, obj.Name, formatEndpoints(obj, nil), translateTimestampSince(obj.CreationTimestamp))
- return []metav1beta1.TableRow{row}, nil
- }
- func printEndpointsList(list *api.EndpointsList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printEndpoints(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printNamespace(obj *api.Namespace, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- row.Cells = append(row.Cells, obj.Name, string(obj.Status.Phase), translateTimestampSince(obj.CreationTimestamp))
- return []metav1beta1.TableRow{row}, nil
- }
- func printNamespaceList(list *api.NamespaceList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printNamespace(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printSecret(obj *api.Secret, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- row.Cells = append(row.Cells, obj.Name, string(obj.Type), int64(len(obj.Data)), translateTimestampSince(obj.CreationTimestamp))
- return []metav1beta1.TableRow{row}, nil
- }
- func printSecretList(list *api.SecretList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printSecret(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printServiceAccount(obj *api.ServiceAccount, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- row.Cells = append(row.Cells, obj.Name, int64(len(obj.Secrets)), translateTimestampSince(obj.CreationTimestamp))
- return []metav1beta1.TableRow{row}, nil
- }
- func printServiceAccountList(list *api.ServiceAccountList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printServiceAccount(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printNode(obj *api.Node, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- conditionMap := make(map[api.NodeConditionType]*api.NodeCondition)
- NodeAllConditions := []api.NodeConditionType{api.NodeReady}
- for i := range obj.Status.Conditions {
- cond := obj.Status.Conditions[i]
- conditionMap[cond.Type] = &cond
- }
- var status []string
- for _, validCondition := range NodeAllConditions {
- if condition, ok := conditionMap[validCondition]; ok {
- if condition.Status == api.ConditionTrue {
- status = append(status, string(condition.Type))
- } else {
- status = append(status, "Not"+string(condition.Type))
- }
- }
- }
- if len(status) == 0 {
- status = append(status, "Unknown")
- }
- if obj.Spec.Unschedulable {
- status = append(status, "SchedulingDisabled")
- }
- roles := strings.Join(findNodeRoles(obj), ",")
- if len(roles) == 0 {
- roles = "<none>"
- }
- row.Cells = append(row.Cells, obj.Name, strings.Join(status, ","), roles, translateTimestampSince(obj.CreationTimestamp), obj.Status.NodeInfo.KubeletVersion)
- if options.Wide {
- osImage, kernelVersion, crVersion := obj.Status.NodeInfo.OSImage, obj.Status.NodeInfo.KernelVersion, obj.Status.NodeInfo.ContainerRuntimeVersion
- if osImage == "" {
- osImage = "<unknown>"
- }
- if kernelVersion == "" {
- kernelVersion = "<unknown>"
- }
- if crVersion == "" {
- crVersion = "<unknown>"
- }
- row.Cells = append(row.Cells, getNodeInternalIP(obj), getNodeExternalIP(obj), osImage, kernelVersion, crVersion)
- }
- return []metav1beta1.TableRow{row}, nil
- }
- // Returns first external ip of the node or "<none>" if none is found.
- func getNodeExternalIP(node *api.Node) string {
- for _, address := range node.Status.Addresses {
- if address.Type == api.NodeExternalIP {
- return address.Address
- }
- }
- return "<none>"
- }
- // Returns the internal IP of the node or "<none>" if none is found.
- func getNodeInternalIP(node *api.Node) string {
- for _, address := range node.Status.Addresses {
- if address.Type == api.NodeInternalIP {
- return address.Address
- }
- }
- return "<none>"
- }
- // findNodeRoles returns the roles of a given node.
- // The roles are determined by looking for:
- // * a node-role.kubernetes.io/<role>="" label
- // * a kubernetes.io/role="<role>" label
- func findNodeRoles(node *api.Node) []string {
- roles := sets.NewString()
- for k, v := range node.Labels {
- switch {
- case strings.HasPrefix(k, labelNodeRolePrefix):
- if role := strings.TrimPrefix(k, labelNodeRolePrefix); len(role) > 0 {
- roles.Insert(role)
- }
- case k == nodeLabelRole && v != "":
- roles.Insert(v)
- }
- }
- return roles.List()
- }
- func printNodeList(list *api.NodeList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printNode(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printPersistentVolume(obj *api.PersistentVolume, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- claimRefUID := ""
- if obj.Spec.ClaimRef != nil {
- claimRefUID += obj.Spec.ClaimRef.Namespace
- claimRefUID += "/"
- claimRefUID += obj.Spec.ClaimRef.Name
- }
- modesStr := helper.GetAccessModesAsString(obj.Spec.AccessModes)
- reclaimPolicyStr := string(obj.Spec.PersistentVolumeReclaimPolicy)
- aQty := obj.Spec.Capacity[api.ResourceStorage]
- aSize := aQty.String()
- phase := obj.Status.Phase
- if obj.ObjectMeta.DeletionTimestamp != nil {
- phase = "Terminating"
- }
- volumeMode := "<unset>"
- if obj.Spec.VolumeMode != nil {
- volumeMode = string(*obj.Spec.VolumeMode)
- }
- row.Cells = append(row.Cells, obj.Name, aSize, modesStr, reclaimPolicyStr,
- string(phase), claimRefUID, helper.GetPersistentVolumeClass(obj),
- obj.Status.Reason, translateTimestampSince(obj.CreationTimestamp), volumeMode)
- return []metav1beta1.TableRow{row}, nil
- }
- func printPersistentVolumeList(list *api.PersistentVolumeList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printPersistentVolume(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printPersistentVolumeClaim(obj *api.PersistentVolumeClaim, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- phase := obj.Status.Phase
- if obj.ObjectMeta.DeletionTimestamp != nil {
- phase = "Terminating"
- }
- storage := obj.Spec.Resources.Requests[api.ResourceStorage]
- capacity := ""
- accessModes := ""
- volumeMode := "<unset>"
- if obj.Spec.VolumeName != "" {
- accessModes = helper.GetAccessModesAsString(obj.Status.AccessModes)
- storage = obj.Status.Capacity[api.ResourceStorage]
- capacity = storage.String()
- }
- if obj.Spec.VolumeMode != nil {
- volumeMode = string(*obj.Spec.VolumeMode)
- }
- row.Cells = append(row.Cells, obj.Name, string(phase), obj.Spec.VolumeName, capacity, accessModes,
- helper.GetPersistentVolumeClaimClass(obj), translateTimestampSince(obj.CreationTimestamp), volumeMode)
- return []metav1beta1.TableRow{row}, nil
- }
- func printPersistentVolumeClaimList(list *api.PersistentVolumeClaimList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printPersistentVolumeClaim(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printEvent(obj *api.Event, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- // While watching event, we should print absolute time.
- var firstTimestamp, lastTimestamp string
- if options.AbsoluteTimestamps {
- firstTimestamp = obj.FirstTimestamp.String()
- lastTimestamp = obj.LastTimestamp.String()
- } else {
- firstTimestamp = translateTimestampSince(obj.FirstTimestamp)
- lastTimestamp = translateTimestampSince(obj.LastTimestamp)
- }
- var target string
- if len(obj.InvolvedObject.Name) > 0 {
- target = fmt.Sprintf("%s/%s", strings.ToLower(obj.InvolvedObject.Kind), obj.InvolvedObject.Name)
- } else {
- target = strings.ToLower(obj.InvolvedObject.Kind)
- }
- if options.Wide {
- row.Cells = append(row.Cells,
- lastTimestamp,
- obj.Type,
- obj.Reason,
- target,
- obj.InvolvedObject.FieldPath,
- formatEventSource(obj.Source),
- strings.TrimSpace(obj.Message),
- firstTimestamp,
- int64(obj.Count),
- obj.Name,
- )
- } else {
- row.Cells = append(row.Cells,
- lastTimestamp,
- obj.Type,
- obj.Reason,
- target,
- strings.TrimSpace(obj.Message),
- )
- }
- return []metav1beta1.TableRow{row}, nil
- }
- // Sorts and prints the EventList in a human-friendly format.
- func printEventList(list *api.EventList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printEvent(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printRoleBinding(obj *rbac.RoleBinding, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- row.Cells = append(row.Cells, obj.Name, translateTimestampSince(obj.CreationTimestamp))
- if options.Wide {
- roleRef := fmt.Sprintf("%s/%s", obj.RoleRef.Kind, obj.RoleRef.Name)
- users, groups, sas, _ := rbac.SubjectsStrings(obj.Subjects)
- row.Cells = append(row.Cells, roleRef, strings.Join(users, ", "), strings.Join(groups, ", "), strings.Join(sas, ", "))
- }
- return []metav1beta1.TableRow{row}, nil
- }
- // Prints the RoleBinding in a human-friendly format.
- func printRoleBindingList(list *rbac.RoleBindingList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printRoleBinding(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printClusterRoleBinding(obj *rbac.ClusterRoleBinding, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- row.Cells = append(row.Cells, obj.Name, translateTimestampSince(obj.CreationTimestamp))
- if options.Wide {
- roleRef := fmt.Sprintf("%s/%s", obj.RoleRef.Kind, obj.RoleRef.Name)
- users, groups, sas, _ := rbac.SubjectsStrings(obj.Subjects)
- row.Cells = append(row.Cells, roleRef, strings.Join(users, ", "), strings.Join(groups, ", "), strings.Join(sas, ", "))
- }
- return []metav1beta1.TableRow{row}, nil
- }
- // Prints the ClusterRoleBinding in a human-friendly format.
- func printClusterRoleBindingList(list *rbac.ClusterRoleBindingList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printClusterRoleBinding(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printCertificateSigningRequest(obj *certificates.CertificateSigningRequest, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- status, err := extractCSRStatus(obj)
- if err != nil {
- return nil, err
- }
- row.Cells = append(row.Cells, obj.Name, translateTimestampSince(obj.CreationTimestamp), obj.Spec.Username, status)
- return []metav1beta1.TableRow{row}, nil
- }
- func extractCSRStatus(csr *certificates.CertificateSigningRequest) (string, error) {
- var approved, denied bool
- for _, c := range csr.Status.Conditions {
- switch c.Type {
- case certificates.CertificateApproved:
- approved = true
- case certificates.CertificateDenied:
- denied = true
- default:
- return "", fmt.Errorf("unknown csr condition %q", c)
- }
- }
- var status string
- // must be in order of presidence
- if denied {
- status += "Denied"
- } else if approved {
- status += "Approved"
- } else {
- status += "Pending"
- }
- if len(csr.Status.Certificate) > 0 {
- status += ",Issued"
- }
- return status, nil
- }
- func printCertificateSigningRequestList(list *certificates.CertificateSigningRequestList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printCertificateSigningRequest(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printComponentStatus(obj *api.ComponentStatus, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- status := "Unknown"
- message := ""
- error := ""
- for _, condition := range obj.Conditions {
- if condition.Type == api.ComponentHealthy {
- if condition.Status == api.ConditionTrue {
- status = "Healthy"
- } else {
- status = "Unhealthy"
- }
- message = condition.Message
- error = condition.Error
- break
- }
- }
- row.Cells = append(row.Cells, obj.Name, status, message, error)
- return []metav1beta1.TableRow{row}, nil
- }
- func printComponentStatusList(list *api.ComponentStatusList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printComponentStatus(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printDeployment(obj *apps.Deployment, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- desiredReplicas := obj.Spec.Replicas
- updatedReplicas := obj.Status.UpdatedReplicas
- readyReplicas := obj.Status.ReadyReplicas
- availableReplicas := obj.Status.AvailableReplicas
- age := translateTimestampSince(obj.CreationTimestamp)
- containers := obj.Spec.Template.Spec.Containers
- selector, err := metav1.LabelSelectorAsSelector(obj.Spec.Selector)
- if err != nil {
- // this shouldn't happen if LabelSelector passed validation
- return nil, err
- }
- row.Cells = append(row.Cells, obj.Name, fmt.Sprintf("%d/%d", int64(readyReplicas), int64(desiredReplicas)), int64(updatedReplicas), int64(availableReplicas), age)
- if options.Wide {
- containers, images := layoutContainerCells(containers)
- row.Cells = append(row.Cells, containers, images, selector.String())
- }
- return []metav1beta1.TableRow{row}, nil
- }
- func printDeploymentList(list *apps.DeploymentList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printDeployment(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func formatHPAMetrics(specs []autoscaling.MetricSpec, statuses []autoscaling.MetricStatus) string {
- if len(specs) == 0 {
- return "<none>"
- }
- list := []string{}
- max := 2
- more := false
- count := 0
- for i, spec := range specs {
- switch spec.Type {
- case autoscaling.ExternalMetricSourceType:
- if spec.External.Target.AverageValue != nil {
- current := "<unknown>"
- if len(statuses) > i && statuses[i].External != nil && statuses[i].External.Current.AverageValue != nil {
- current = statuses[i].External.Current.AverageValue.String()
- }
- list = append(list, fmt.Sprintf("%s/%s (avg)", current, spec.External.Target.AverageValue.String()))
- } else {
- current := "<unknown>"
- if len(statuses) > i && statuses[i].External != nil {
- current = statuses[i].External.Current.Value.String()
- }
- list = append(list, fmt.Sprintf("%s/%s", current, spec.External.Target.Value.String()))
- }
- case autoscaling.PodsMetricSourceType:
- current := "<unknown>"
- if len(statuses) > i && statuses[i].Pods != nil {
- current = statuses[i].Pods.Current.AverageValue.String()
- }
- list = append(list, fmt.Sprintf("%s/%s", current, spec.Pods.Target.AverageValue.String()))
- case autoscaling.ObjectMetricSourceType:
- current := "<unknown>"
- if len(statuses) > i && statuses[i].Object != nil {
- current = statuses[i].Object.Current.Value.String()
- }
- list = append(list, fmt.Sprintf("%s/%s", current, spec.Object.Target.Value.String()))
- case autoscaling.ResourceMetricSourceType:
- if spec.Resource.Target.AverageValue != nil {
- current := "<unknown>"
- if len(statuses) > i && statuses[i].Resource != nil {
- current = statuses[i].Resource.Current.AverageValue.String()
- }
- list = append(list, fmt.Sprintf("%s/%s", current, spec.Resource.Target.AverageValue.String()))
- } else {
- current := "<unknown>"
- if len(statuses) > i && statuses[i].Resource != nil && statuses[i].Resource.Current.AverageUtilization != nil {
- current = fmt.Sprintf("%d%%", *statuses[i].Resource.Current.AverageUtilization)
- }
- target := "<auto>"
- if spec.Resource.Target.AverageUtilization != nil {
- target = fmt.Sprintf("%d%%", *spec.Resource.Target.AverageUtilization)
- }
- list = append(list, fmt.Sprintf("%s/%s", current, target))
- }
- default:
- list = append(list, "<unknown type>")
- }
- count++
- }
- if count > max {
- list = list[:max]
- more = true
- }
- ret := strings.Join(list, ", ")
- if more {
- return fmt.Sprintf("%s + %d more...", ret, count-max)
- }
- return ret
- }
- func printHorizontalPodAutoscaler(obj *autoscaling.HorizontalPodAutoscaler, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- reference := fmt.Sprintf("%s/%s",
- obj.Spec.ScaleTargetRef.Kind,
- obj.Spec.ScaleTargetRef.Name)
- minPods := "<unset>"
- metrics := formatHPAMetrics(obj.Spec.Metrics, obj.Status.CurrentMetrics)
- if obj.Spec.MinReplicas != nil {
- minPods = fmt.Sprintf("%d", *obj.Spec.MinReplicas)
- }
- maxPods := obj.Spec.MaxReplicas
- currentReplicas := obj.Status.CurrentReplicas
- row.Cells = append(row.Cells, obj.Name, reference, metrics, minPods, int64(maxPods), int64(currentReplicas), translateTimestampSince(obj.CreationTimestamp))
- return []metav1beta1.TableRow{row}, nil
- }
- func printHorizontalPodAutoscalerList(list *autoscaling.HorizontalPodAutoscalerList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printHorizontalPodAutoscaler(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printConfigMap(obj *api.ConfigMap, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- row.Cells = append(row.Cells, obj.Name, int64(len(obj.Data)), translateTimestampSince(obj.CreationTimestamp))
- return []metav1beta1.TableRow{row}, nil
- }
- func printConfigMapList(list *api.ConfigMapList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printConfigMap(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printPodSecurityPolicy(obj *policy.PodSecurityPolicy, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- capabilities := make([]string, len(obj.Spec.AllowedCapabilities))
- for i, c := range obj.Spec.AllowedCapabilities {
- capabilities[i] = string(c)
- }
- volumes := make([]string, len(obj.Spec.Volumes))
- for i, v := range obj.Spec.Volumes {
- volumes[i] = string(v)
- }
- row.Cells = append(row.Cells, obj.Name, fmt.Sprintf("%v", obj.Spec.Privileged),
- strings.Join(capabilities, ","), string(obj.Spec.SELinux.Rule),
- string(obj.Spec.RunAsUser.Rule), string(obj.Spec.FSGroup.Rule),
- string(obj.Spec.SupplementalGroups.Rule), obj.Spec.ReadOnlyRootFilesystem,
- strings.Join(volumes, ","))
- return []metav1beta1.TableRow{row}, nil
- }
- func printPodSecurityPolicyList(list *policy.PodSecurityPolicyList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printPodSecurityPolicy(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printNetworkPolicy(obj *networking.NetworkPolicy, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- row.Cells = append(row.Cells, obj.Name, metav1.FormatLabelSelector(&obj.Spec.PodSelector), translateTimestampSince(obj.CreationTimestamp))
- return []metav1beta1.TableRow{row}, nil
- }
- func printNetworkPolicyList(list *networking.NetworkPolicyList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printNetworkPolicy(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printStorageClass(obj *storage.StorageClass, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- name := obj.Name
- if storageutil.IsDefaultAnnotation(obj.ObjectMeta) {
- name += " (default)"
- }
- provtype := obj.Provisioner
- row.Cells = append(row.Cells, name, provtype, translateTimestampSince(obj.CreationTimestamp))
- return []metav1beta1.TableRow{row}, nil
- }
- func printStorageClassList(list *storage.StorageClassList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printStorageClass(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printLease(obj *coordination.Lease, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- var holderIdentity string
- if obj.Spec.HolderIdentity != nil {
- holderIdentity = *obj.Spec.HolderIdentity
- }
- row.Cells = append(row.Cells, obj.Name, holderIdentity, translateTimestampSince(obj.CreationTimestamp))
- return []metav1beta1.TableRow{row}, nil
- }
- func printLeaseList(list *coordination.LeaseList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printLease(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printStatus(obj *metav1.Status, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- row.Cells = append(row.Cells, obj.Status, obj.Reason, obj.Message)
- return []metav1beta1.TableRow{row}, nil
- }
- // Lay out all the containers on one line if use wide output.
- func layoutContainerCells(containers []api.Container) (names string, images string) {
- var namesBuffer bytes.Buffer
- var imagesBuffer bytes.Buffer
- for i, container := range containers {
- namesBuffer.WriteString(container.Name)
- imagesBuffer.WriteString(container.Image)
- if i != len(containers)-1 {
- namesBuffer.WriteString(",")
- imagesBuffer.WriteString(",")
- }
- }
- return namesBuffer.String(), imagesBuffer.String()
- }
- // formatEventSource formats EventSource as a comma separated string excluding Host when empty
- func formatEventSource(es api.EventSource) string {
- EventSourceString := []string{es.Component}
- if len(es.Host) > 0 {
- EventSourceString = append(EventSourceString, es.Host)
- }
- return strings.Join(EventSourceString, ", ")
- }
- func printControllerRevision(obj *apps.ControllerRevision, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- controllerRef := metav1.GetControllerOf(obj)
- controllerName := "<none>"
- if controllerRef != nil {
- withKind := true
- gv, err := schema.ParseGroupVersion(controllerRef.APIVersion)
- if err != nil {
- return nil, err
- }
- gvk := gv.WithKind(controllerRef.Kind)
- controllerName = formatResourceName(gvk.GroupKind(), controllerRef.Name, withKind)
- }
- revision := obj.Revision
- age := translateTimestampSince(obj.CreationTimestamp)
- row.Cells = append(row.Cells, obj.Name, controllerName, revision, age)
- return []metav1beta1.TableRow{row}, nil
- }
- func printControllerRevisionList(list *apps.ControllerRevisionList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printControllerRevision(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- // formatResourceName receives a resource kind, name, and boolean specifying
- // whether or not to update the current name to "kind/name"
- func formatResourceName(kind schema.GroupKind, name string, withKind bool) string {
- if !withKind || kind.Empty() {
- return name
- }
- return strings.ToLower(kind.String()) + "/" + name
- }
- func printResourceQuota(resourceQuota *api.ResourceQuota, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: resourceQuota},
- }
- resources := make([]api.ResourceName, 0, len(resourceQuota.Status.Hard))
- for resource := range resourceQuota.Status.Hard {
- resources = append(resources, resource)
- }
- sort.Sort(SortableResourceNames(resources))
- requestColumn := bytes.NewBuffer([]byte{})
- limitColumn := bytes.NewBuffer([]byte{})
- for i := range resources {
- w := requestColumn
- resource := resources[i]
- usedQuantity := resourceQuota.Status.Used[resource]
- hardQuantity := resourceQuota.Status.Hard[resource]
- // use limitColumn writer if a resource name prefixed with "limits" is found
- if pieces := strings.Split(resource.String(), "."); len(pieces) > 1 && pieces[0] == "limits" {
- w = limitColumn
- }
- fmt.Fprintf(w, "%s: %s/%s, ", resource, usedQuantity.String(), hardQuantity.String())
- }
- age := translateTimestampSince(resourceQuota.CreationTimestamp)
- row.Cells = append(row.Cells, resourceQuota.Name, age, strings.TrimSuffix(requestColumn.String(), ", "), strings.TrimSuffix(limitColumn.String(), ", "))
- return []metav1beta1.TableRow{row}, nil
- }
- func printResourceQuotaList(list *api.ResourceQuotaList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printResourceQuota(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printPriorityClass(obj *scheduling.PriorityClass, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- name := obj.Name
- value := obj.Value
- globalDefault := obj.GlobalDefault
- row.Cells = append(row.Cells, name, int64(value), globalDefault, translateTimestampSince(obj.CreationTimestamp))
- return []metav1beta1.TableRow{row}, nil
- }
- func printPriorityClassList(list *scheduling.PriorityClassList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printPriorityClass(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printRuntimeClass(obj *nodeapi.RuntimeClass, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- name := obj.Name
- handler := obj.Handler
- row.Cells = append(row.Cells, name, handler, translateTimestampSince(obj.CreationTimestamp))
- return []metav1beta1.TableRow{row}, nil
- }
- func printRuntimeClassList(list *nodeapi.RuntimeClassList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printRuntimeClass(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printVolumeAttachment(obj *storage.VolumeAttachment, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- row := metav1beta1.TableRow{
- Object: runtime.RawExtension{Object: obj},
- }
- name := obj.Name
- pvName := ""
- if obj.Spec.Source.PersistentVolumeName != nil {
- pvName = *obj.Spec.Source.PersistentVolumeName
- }
- row.Cells = append(row.Cells, name, obj.Spec.Attacher, pvName, obj.Spec.NodeName, obj.Status.Attached, translateTimestampSince(obj.CreationTimestamp))
- return []metav1beta1.TableRow{row}, nil
- }
- func printVolumeAttachmentList(list *storage.VolumeAttachmentList, options printers.PrintOptions) ([]metav1beta1.TableRow, error) {
- rows := make([]metav1beta1.TableRow, 0, len(list.Items))
- for i := range list.Items {
- r, err := printVolumeAttachment(&list.Items[i], options)
- if err != nil {
- return nil, err
- }
- rows = append(rows, r...)
- }
- return rows, nil
- }
- func printBoolPtr(value *bool) string {
- if value != nil {
- return printBool(*value)
- }
- return "<unset>"
- }
- func printBool(value bool) string {
- if value {
- return "True"
- }
- return "False"
- }
- // SortableResourceNames - An array of sortable resource names
- type SortableResourceNames []api.ResourceName
- func (list SortableResourceNames) Len() int {
- return len(list)
- }
- func (list SortableResourceNames) Swap(i, j int) {
- list[i], list[j] = list[j], list[i]
- }
- func (list SortableResourceNames) Less(i, j int) bool {
- return list[i] < list[j]
- }
|