2014-10-06 01:24:19 +00:00
/ *
2017-02-19 03:40:38 +00:00
Copyright 2017 The Kubernetes Authors .
2014-10-06 01:24:19 +00:00
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 .
* /
2017-02-19 03:40:38 +00:00
package internalversion
2014-10-06 01:24:19 +00:00
import (
"bytes"
"fmt"
"io"
2017-02-21 14:21:00 +00:00
"net"
2014-12-16 22:20:51 +00:00
"sort"
2017-02-21 14:21:00 +00:00
"strconv"
2014-10-06 01:24:19 +00:00
"strings"
2014-12-16 22:20:51 +00:00
"time"
2014-10-06 01:24:19 +00:00
2017-07-25 02:50:52 +00:00
appsv1beta1 "k8s.io/api/apps/v1beta1"
2017-07-27 10:02:54 +00:00
autoscalingv2alpha1 "k8s.io/api/autoscaling/v2alpha1"
2017-06-24 22:31:36 +00:00
batchv1 "k8s.io/api/batch/v1"
2017-08-31 16:54:16 +00:00
batchv2alpha1 "k8s.io/api/batch/v2alpha1"
2017-07-28 07:31:20 +00:00
certificatesv1beta1 "k8s.io/api/certificates/v1beta1"
2017-06-22 18:24:23 +00:00
apiv1 "k8s.io/api/core/v1"
2017-06-24 22:31:36 +00:00
extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
2017-07-28 07:20:13 +00:00
rbacv1beta1 "k8s.io/api/rbac/v1beta1"
2017-07-28 08:29:45 +00:00
storagev1 "k8s.io/api/storage/v1"
2017-06-25 19:43:05 +00:00
"k8s.io/apimachinery/pkg/api/meta"
2017-01-11 14:09:48 +00:00
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2017-05-26 23:00:01 +00:00
metav1alpha1 "k8s.io/apimachinery/pkg/apis/meta/v1alpha1"
2017-01-11 14:09:48 +00:00
"k8s.io/apimachinery/pkg/labels"
2017-05-26 23:00:01 +00:00
"k8s.io/apimachinery/pkg/runtime"
2017-01-11 14:09:48 +00:00
"k8s.io/apimachinery/pkg/util/sets"
2016-04-26 14:33:47 +00:00
"k8s.io/kubernetes/federation/apis/federation"
2015-08-05 22:03:47 +00:00
"k8s.io/kubernetes/pkg/api"
2016-09-15 15:56:40 +00:00
"k8s.io/kubernetes/pkg/api/events"
2017-04-10 17:49:54 +00:00
"k8s.io/kubernetes/pkg/api/helper"
2016-04-15 22:30:15 +00:00
"k8s.io/kubernetes/pkg/apis/apps"
2016-05-05 10:27:24 +00:00
"k8s.io/kubernetes/pkg/apis/autoscaling"
2016-04-18 15:44:19 +00:00
"k8s.io/kubernetes/pkg/apis/batch"
2016-08-05 21:46:20 +00:00
"k8s.io/kubernetes/pkg/apis/certificates"
2015-10-09 22:04:41 +00:00
"k8s.io/kubernetes/pkg/apis/extensions"
2017-03-13 14:31:16 +00:00
"k8s.io/kubernetes/pkg/apis/networking"
2016-10-21 11:57:49 +00:00
"k8s.io/kubernetes/pkg/apis/policy"
2016-06-06 23:59:19 +00:00
"k8s.io/kubernetes/pkg/apis/rbac"
2016-09-01 15:29:26 +00:00
"k8s.io/kubernetes/pkg/apis/storage"
2016-10-12 19:49:16 +00:00
storageutil "k8s.io/kubernetes/pkg/apis/storage/util"
2017-02-19 22:37:24 +00:00
"k8s.io/kubernetes/pkg/printers"
2016-11-01 19:59:06 +00:00
"k8s.io/kubernetes/pkg/util/node"
2015-09-23 21:50:59 +00:00
)
2017-08-10 08:19:13 +00:00
const (
loadBalancerWidth = 16
2017-08-23 04:48:59 +00:00
// labelNodeRolePrefix is a label prefix for node roles
2017-08-10 08:19:13 +00:00
// It's copied over to here until it's merged in core: https://github.com/kubernetes/kubernetes/pull/39112
2017-08-23 04:48:59 +00:00
labelNodeRolePrefix = "node-role.kubernetes.io/"
2017-08-10 08:19:13 +00:00
2017-08-23 04:48:59 +00:00
// nodeLabelRole specifies the role of a node
nodeLabelRole = "kubernetes.io/role"
2017-08-10 08:19:13 +00:00
)
2014-10-06 01:24:19 +00:00
2017-05-26 23:00:01 +00:00
// AddHandlers adds print handlers for default Kubernetes types dealing with internal versions.
// TODO: handle errors from Handler
func AddHandlers ( h printers . PrintHandler ) {
podColumnDefinitions := [ ] metav1alpha1 . 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" ] } ,
2016-07-13 16:00:33 +00:00
}
2017-05-26 23:00:01 +00:00
h . TableHandler ( podColumnDefinitions , printPodList )
h . TableHandler ( podColumnDefinitions , printPod )
2016-07-13 16:00:33 +00:00
2017-06-24 22:31:36 +00:00
podTemplateColumnDefinitions := [ ] metav1alpha1 . 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 := [ ] metav1alpha1 . 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 := [ ] metav1alpha1 . 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 := [ ] metav1alpha1 . 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 )
2017-06-25 17:01:14 +00:00
daemonSetColumnDefinitions := [ ] metav1alpha1 . 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 )
2017-06-24 22:31:36 +00:00
jobColumnDefinitions := [ ] metav1alpha1 . TableColumnDefinition {
{ Name : "Name" , Type : "string" , Format : "name" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "name" ] } ,
{ Name : "Desired" , Type : "integer" , Description : batchv1 . JobSpec { } . SwaggerDoc ( ) [ "completions" ] } ,
{ Name : "Successful" , Type : "integer" , Description : batchv1 . JobStatus { } . SwaggerDoc ( ) [ "succeeded" ] } ,
{ 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 := [ ] metav1alpha1 . TableColumnDefinition {
{ Name : "Name" , Type : "string" , Format : "name" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "name" ] } ,
2017-08-31 16:54:16 +00:00
{ Name : "Schedule" , Type : "string" , Description : batchv2alpha1 . CronJobSpec { } . SwaggerDoc ( ) [ "schedule" ] } ,
{ Name : "Suspend" , Type : "boolean" , Description : batchv2alpha1 . CronJobSpec { } . SwaggerDoc ( ) [ "suspend" ] } ,
{ Name : "Active" , Type : "integer" , Description : batchv2alpha1 . CronJobStatus { } . SwaggerDoc ( ) [ "active" ] } ,
{ Name : "Last Schedule" , Type : "string" , Description : batchv2alpha1 . CronJobStatus { } . SwaggerDoc ( ) [ "lastScheduleTime" ] } ,
2017-06-24 22:31:36 +00:00
{ 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 )
2017-07-21 07:42:30 +00:00
serviceColumnDefinitions := [ ] metav1alpha1 . 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 )
2017-07-25 02:05:10 +00:00
ingressColumnDefinitions := [ ] metav1alpha1 . 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 )
2017-07-25 02:50:52 +00:00
statefulSetColumnDefinitions := [ ] metav1alpha1 . TableColumnDefinition {
{ Name : "Name" , Type : "string" , Format : "name" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "name" ] } ,
{ Name : "Desired" , Type : "string" , Description : appsv1beta1 . StatefulSetSpec { } . SwaggerDoc ( ) [ "replicas" ] } ,
{ Name : "Current" , Type : "string" , Description : appsv1beta1 . StatefulSetStatus { } . SwaggerDoc ( ) [ "replicas" ] } ,
{ 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 )
2017-07-25 03:04:37 +00:00
endpointColumnDefinitions := [ ] metav1alpha1 . 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 )
2017-07-25 04:20:50 +00:00
nodeColumnDefinitions := [ ] metav1alpha1 . TableColumnDefinition {
{ Name : "Name" , Type : "string" , Format : "name" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "name" ] } ,
{ Name : "Status" , Type : "string" , Description : "The status of the node" } ,
2017-08-23 04:48:59 +00:00
{ Name : "Roles" , Type : "string" , Description : "The roles of the node" } ,
2017-07-25 04:20:50 +00:00
{ Name : "Age" , Type : "string" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "creationTimestamp" ] } ,
{ Name : "Version" , Type : "string" , Description : apiv1 . NodeSystemInfo { } . SwaggerDoc ( ) [ "kubeletVersion" ] } ,
{ 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 )
2017-07-27 07:37:18 +00:00
eventColumnDefinitions := [ ] metav1alpha1 . TableColumnDefinition {
2017-08-03 02:44:02 +00:00
{ Name : "Last Seen" , Type : "string" , Description : apiv1 . Event { } . SwaggerDoc ( ) [ "lastTimestamp" ] } ,
{ Name : "First Seen" , Type : "string" , Description : apiv1 . Event { } . SwaggerDoc ( ) [ "firstTimestamp" ] } ,
2017-07-27 07:37:18 +00:00
{ Name : "Count" , Type : "string" , Description : apiv1 . Event { } . SwaggerDoc ( ) [ "count" ] } ,
{ Name : "Name" , Type : "string" , Format : "name" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "name" ] } ,
{ Name : "Kind" , Type : "string" , Description : apiv1 . Event { } . InvolvedObject . SwaggerDoc ( ) [ "kind" ] } ,
{ Name : "Subobject" , Type : "string" , Description : apiv1 . Event { } . InvolvedObject . SwaggerDoc ( ) [ "fieldPath" ] } ,
{ Name : "Type" , Type : "string" , Description : apiv1 . Event { } . SwaggerDoc ( ) [ "type" ] } ,
{ Name : "Reason" , Type : "string" , Description : apiv1 . Event { } . SwaggerDoc ( ) [ "reason" ] } ,
{ Name : "Source" , Type : "string" , Description : apiv1 . Event { } . SwaggerDoc ( ) [ "source" ] } ,
{ Name : "Message" , Type : "string" , Description : apiv1 . Event { } . SwaggerDoc ( ) [ "message" ] } ,
}
h . TableHandler ( eventColumnDefinitions , printEvent )
h . TableHandler ( eventColumnDefinitions , printEventList )
2017-07-27 08:10:57 +00:00
2017-07-27 08:04:33 +00:00
namespaceColumnDefinitions := [ ] metav1alpha1 . 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 )
2017-07-27 07:37:18 +00:00
2017-07-27 08:10:57 +00:00
secretColumnDefinitions := [ ] metav1alpha1 . 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" ] } ,
}
2017-07-27 08:14:27 +00:00
h . TableHandler ( secretColumnDefinitions , printSecret )
2017-07-27 08:10:57 +00:00
h . TableHandler ( secretColumnDefinitions , printSecretList )
2017-07-27 08:14:27 +00:00
serviceAccountColumnDefinitions := [ ] metav1alpha1 . 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 )
2017-07-27 08:26:54 +00:00
persistentVolumeColumnDefinitions := [ ] metav1alpha1 . TableColumnDefinition {
{ Name : "Name" , Type : "string" , Format : "name" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "name" ] } ,
{ Name : "Capacity" , Type : "string" , Description : apiv1 . PersistentVolumeSpec { } . SwaggerDoc ( ) [ "capacity" ] } ,
2017-08-03 02:44:02 +00:00
{ Name : "Access Modes" , Type : "string" , Description : apiv1 . PersistentVolumeSpec { } . SwaggerDoc ( ) [ "accessModes" ] } ,
{ Name : "Reclaim Policy" , Type : "string" , Description : apiv1 . PersistentVolumeSpec { } . SwaggerDoc ( ) [ "persistentVolumeReclaimPolicy" ] } ,
2017-07-27 08:26:54 +00:00
{ 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" ] } ,
}
h . TableHandler ( persistentVolumeColumnDefinitions , printPersistentVolume )
h . TableHandler ( persistentVolumeColumnDefinitions , printPersistentVolumeList )
2017-07-27 08:34:23 +00:00
persistentVolumeClaimColumnDefinitions := [ ] metav1alpha1 . TableColumnDefinition {
{ Name : "Name" , Type : "string" , Format : "name" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "name" ] } ,
{ Name : "Status" , Type : "string" , Description : apiv1 . PersistentVolumeClaimStatus { } . SwaggerDoc ( ) [ "phase" ] } ,
2017-08-19 09:02:58 +00:00
{ Name : "Volume" , Type : "string" , Description : apiv1 . PersistentVolumeSpec { } . SwaggerDoc ( ) [ "volumeName" ] } ,
2017-07-27 08:34:23 +00:00
{ Name : "Capacity" , Type : "string" , Description : apiv1 . PersistentVolumeClaimStatus { } . SwaggerDoc ( ) [ "capacity" ] } ,
2017-08-03 02:44:02 +00:00
{ Name : "Access Modes" , Type : "string" , Description : apiv1 . PersistentVolumeClaimStatus { } . SwaggerDoc ( ) [ "accessModes" ] } ,
2017-07-27 08:34:23 +00:00
{ Name : "StorageClass" , Type : "string" , Description : "StorageClass of the pvc" } ,
{ Name : "Age" , Type : "string" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "creationTimestamp" ] } ,
}
h . TableHandler ( persistentVolumeClaimColumnDefinitions , printPersistentVolumeClaim )
h . TableHandler ( persistentVolumeClaimColumnDefinitions , printPersistentVolumeClaimList )
2017-07-27 08:26:54 +00:00
2017-07-27 08:57:58 +00:00
componentStatusColumnDefinitions := [ ] metav1alpha1 . 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 )
2017-07-27 09:22:48 +00:00
thirdPartyResourceColumnDefinitions := [ ] metav1alpha1 . TableColumnDefinition {
{ Name : "Name" , Type : "string" , Format : "name" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "name" ] } ,
{ Name : "Description" , Type : "string" , Description : extensionsv1beta1 . ThirdPartyResource { } . SwaggerDoc ( ) [ "description" ] } ,
2017-08-03 02:44:02 +00:00
{ Name : "Version(s)" , Type : "string" , Description : extensionsv1beta1 . ThirdPartyResource { } . SwaggerDoc ( ) [ "versions" ] } ,
2017-07-27 09:22:48 +00:00
}
h . TableHandler ( thirdPartyResourceColumnDefinitions , printThirdPartyResource )
h . TableHandler ( thirdPartyResourceColumnDefinitions , printThirdPartyResourceList )
deploymentColumnDefinitions := [ ] metav1alpha1 . TableColumnDefinition {
{ Name : "Name" , Type : "string" , Format : "name" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "name" ] } ,
{ Name : "Desired" , Type : "string" , Description : extensionsv1beta1 . DeploymentSpec { } . SwaggerDoc ( ) [ "replicas" ] } ,
{ Name : "Current" , Type : "string" , Description : extensionsv1beta1 . DeploymentStatus { } . SwaggerDoc ( ) [ "replicas" ] } ,
{ 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 )
2017-07-27 10:02:54 +00:00
horizontalPodAutoscalerColumnDefinitions := [ ] metav1alpha1 . TableColumnDefinition {
{ Name : "Name" , Type : "string" , Format : "name" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "name" ] } ,
2017-08-03 02:44:02 +00:00
{ Name : "Reference" , Type : "string" , Description : autoscalingv2alpha1 . HorizontalPodAutoscalerSpec { } . SwaggerDoc ( ) [ "scaleTargetRef" ] } ,
2017-07-27 10:02:54 +00:00
{ Name : "Targets" , Type : "string" , Description : autoscalingv2alpha1 . HorizontalPodAutoscalerSpec { } . SwaggerDoc ( ) [ "metrics" ] } ,
{ Name : "MinPods" , Type : "string" , Description : autoscalingv2alpha1 . HorizontalPodAutoscalerSpec { } . SwaggerDoc ( ) [ "minReplicas" ] } ,
{ Name : "MaxPods" , Type : "string" , Description : autoscalingv2alpha1 . HorizontalPodAutoscalerSpec { } . SwaggerDoc ( ) [ "maxReplicas" ] } ,
{ Name : "Replicas" , Type : "string" , Description : autoscalingv2alpha1 . HorizontalPodAutoscalerStatus { } . SwaggerDoc ( ) [ "currentReplicas" ] } ,
{ Name : "Age" , Type : "string" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "creationTimestamp" ] } ,
}
h . TableHandler ( horizontalPodAutoscalerColumnDefinitions , printHorizontalPodAutoscaler )
h . TableHandler ( horizontalPodAutoscalerColumnDefinitions , printHorizontalPodAutoscalerList )
2017-07-27 10:12:39 +00:00
configMapColumnDefinitions := [ ] metav1alpha1 . 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 )
2017-07-28 06:34:32 +00:00
podSecurityPolicyColumnDefinitions := [ ] metav1alpha1 . TableColumnDefinition {
{ Name : "Name" , Type : "string" , Format : "name" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "name" ] } ,
{ Name : "Data" , Type : "string" , Description : extensionsv1beta1 . PodSecurityPolicySpec { } . SwaggerDoc ( ) [ "privileged" ] } ,
{ Name : "Caps" , Type : "string" , Description : extensionsv1beta1 . PodSecurityPolicySpec { } . SwaggerDoc ( ) [ "allowedCapabilities" ] } ,
2017-08-03 02:44:02 +00:00
{ Name : "SELinux" , Type : "string" , Description : extensionsv1beta1 . PodSecurityPolicySpec { } . SwaggerDoc ( ) [ "seLinux" ] } ,
2017-07-28 06:34:32 +00:00
{ Name : "RunAsUser" , Type : "string" , Description : extensionsv1beta1 . PodSecurityPolicySpec { } . SwaggerDoc ( ) [ "runAsUser" ] } ,
{ Name : "FsGroup" , Type : "string" , Description : extensionsv1beta1 . PodSecurityPolicySpec { } . SwaggerDoc ( ) [ "fsGroup" ] } ,
{ Name : "SupGroup" , Type : "string" , Description : extensionsv1beta1 . PodSecurityPolicySpec { } . SwaggerDoc ( ) [ "supplementalGroups" ] } ,
{ Name : "ReadOnlyRootFs" , Type : "string" , Description : extensionsv1beta1 . PodSecurityPolicySpec { } . SwaggerDoc ( ) [ "readOnlyRootFilesystem" ] } ,
{ Name : "Volumes" , Type : "string" , Description : extensionsv1beta1 . PodSecurityPolicySpec { } . SwaggerDoc ( ) [ "volumes" ] } ,
}
h . TableHandler ( podSecurityPolicyColumnDefinitions , printPodSecurityPolicy )
h . TableHandler ( podSecurityPolicyColumnDefinitions , printPodSecurityPolicyList )
2017-07-28 07:20:13 +00:00
2017-07-28 06:50:05 +00:00
clusterColumnDefinitions := [ ] metav1alpha1 . TableColumnDefinition {
{ Name : "Name" , Type : "string" , Format : "name" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "name" ] } ,
2017-07-28 08:29:45 +00:00
{ Name : "Status" , Type : "string" , Description : "Status of the cluster" } ,
2017-07-28 06:50:05 +00:00
{ Name : "Age" , Type : "string" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "creationTimestamp" ] } ,
}
h . TableHandler ( clusterColumnDefinitions , printCluster )
h . TableHandler ( clusterColumnDefinitions , printClusterList )
2017-07-28 07:20:13 +00:00
networkPolicyColumnDefinitioins := [ ] metav1alpha1 . TableColumnDefinition {
{ Name : "Name" , Type : "string" , Format : "name" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "name" ] } ,
2017-07-28 08:29:45 +00:00
{ Name : "Pod-Selector" , Type : "string" , Description : extensionsv1beta1 . NetworkPolicySpec { } . SwaggerDoc ( ) [ "podSelector" ] } ,
2017-07-28 07:20:13 +00:00
{ Name : "Age" , Type : "string" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "creationTimestamp" ] } ,
}
h . TableHandler ( networkPolicyColumnDefinitioins , printNetworkPolicy )
h . TableHandler ( networkPolicyColumnDefinitioins , printNetworkPolicyList )
roleBindingsColumnDefinitions := [ ] metav1alpha1 . 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 : "Gruops in the roleBinding" } ,
{ Name : "ServiceAccounts" , Type : "string" , Priority : 1 , Description : "ServiceAccounts in the roleBinding" } ,
}
h . TableHandler ( roleBindingsColumnDefinitions , printRoleBinding )
h . TableHandler ( roleBindingsColumnDefinitions , printRoleBindingList )
clusterRoleBindingsColumnDefinitions := [ ] metav1alpha1 . 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 roleBinding" } ,
{ Name : "Groups" , Type : "string" , Priority : 1 , Description : "Gruops in the roleBinding" } ,
{ Name : "ServiceAccounts" , Type : "string" , Priority : 1 , Description : "ServiceAccounts in the roleBinding" } ,
}
h . TableHandler ( clusterRoleBindingsColumnDefinitions , printClusterRoleBinding )
h . TableHandler ( clusterRoleBindingsColumnDefinitions , printClusterRoleBindingList )
2017-07-28 07:31:20 +00:00
certificateSigningRequestColumnDefinitions := [ ] metav1alpha1 . TableColumnDefinition {
{ Name : "Name" , Type : "string" , Format : "name" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "name" ] } ,
{ Name : "Age" , Type : "string" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "creationTimestamp" ] } ,
2017-07-28 08:29:45 +00:00
{ Name : "Requestor" , Type : "string" , Description : certificatesv1beta1 . CertificateSigningRequestSpec { } . SwaggerDoc ( ) [ "request" ] } ,
{ Name : "Condition" , Type : "string" , Description : certificatesv1beta1 . CertificateSigningRequestStatus { } . SwaggerDoc ( ) [ "conditions" ] } ,
2017-07-28 07:31:20 +00:00
}
h . TableHandler ( certificateSigningRequestColumnDefinitions , printCertificateSigningRequest )
h . TableHandler ( certificateSigningRequestColumnDefinitions , printCertificateSigningRequestList )
2017-07-28 08:29:45 +00:00
storageClassColumnDefinitions := [ ] metav1alpha1 . TableColumnDefinition {
{ Name : "Name" , Type : "string" , Format : "name" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "name" ] } ,
{ Name : "Provisioner" , Type : "string" , Description : storagev1 . StorageClass { } . SwaggerDoc ( ) [ "provisioner" ] } ,
}
h . TableHandler ( storageClassColumnDefinitions , printStorageClass )
h . TableHandler ( storageClassColumnDefinitions , printStorageClassList )
statusColumnDefinitions := [ ] metav1alpha1 . 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 := [ ] metav1alpha1 . 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 )
2017-06-25 19:43:05 +00:00
AddDefaultHandlers ( h )
}
// AddDefaultHandlers adds handlers that can work with most Kubernetes objects.
func AddDefaultHandlers ( h printers . PrintHandler ) {
// types without defined columns
objectMetaColumnDefinitions := [ ] metav1alpha1 . TableColumnDefinition {
{ Name : "Name" , Type : "string" , Format : "name" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "name" ] } ,
{ Name : "Age" , Type : "string" , Description : metav1 . ObjectMeta { } . SwaggerDoc ( ) [ "creationTimestamp" ] } ,
}
h . DefaultTableHandler ( objectMetaColumnDefinitions , printObjectMeta )
}
func printObjectMeta ( obj runtime . Object , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
if meta . IsListType ( obj ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , 16 )
err := meta . EachListItem ( obj , func ( obj runtime . Object ) error {
nestedRows , err := printObjectMeta ( obj , options )
if err != nil {
return err
}
rows = append ( rows , nestedRows ... )
return nil
} )
if err != nil {
return nil , err
}
return rows , nil
}
rows := make ( [ ] metav1alpha1 . TableRow , 0 , 1 )
m , err := meta . Accessor ( obj )
if err != nil {
return nil , err
}
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
}
row . Cells = append ( row . Cells , m . GetName ( ) , translateTimestamp ( m . GetCreationTimestamp ( ) ) )
rows = append ( rows , row )
return rows , nil
2014-10-06 01:24:19 +00:00
}
2015-04-28 05:17:51 +00:00
// Pass ports=nil for all ports.
2015-09-09 17:45:01 +00:00
func formatEndpoints ( endpoints * api . Endpoints , ports sets . String ) string {
2015-03-20 21:24:43 +00:00
if len ( endpoints . Subsets ) == 0 {
2015-02-21 23:13:28 +00:00
return "<none>"
2015-02-05 23:45:53 +00:00
}
2015-02-19 03:54:15 +00:00
list := [ ] string { }
2015-03-20 21:24:43 +00:00
max := 3
more := false
2015-05-25 09:44:56 +00:00
count := 0
2015-03-20 21:24:43 +00:00
for i := range endpoints . Subsets {
ss := & endpoints . Subsets [ i ]
for i := range ss . Ports {
port := & ss . Ports [ i ]
2015-04-28 05:17:51 +00:00
if ports == nil || ports . Has ( port . Name ) {
2015-03-20 21:24:43 +00:00
for i := range ss . Addresses {
if len ( list ) == max {
more = true
}
addr := & ss . Addresses [ i ]
2015-05-25 09:44:56 +00:00
if ! more {
2017-02-21 14:21:00 +00:00
hostPort := net . JoinHostPort ( addr . IP , strconv . Itoa ( int ( port . Port ) ) )
list = append ( list , hostPort )
2015-05-25 09:44:56 +00:00
}
count ++
2015-03-20 21:24:43 +00:00
}
}
}
}
ret := strings . Join ( list , "," )
if more {
2015-05-25 09:44:56 +00:00
return fmt . Sprintf ( "%s + %d more..." , ret , count - max )
2015-02-23 21:53:21 +00:00
}
2015-03-20 21:24:43 +00:00
return ret
2015-02-05 23:45:53 +00:00
}
2015-04-20 23:38:21 +00:00
// translateTimestamp returns the elapsed time since timestamp in
// human-readable approximation.
2016-12-03 18:57:26 +00:00
func translateTimestamp ( timestamp metav1 . Time ) string {
2015-08-13 08:23:10 +00:00
if timestamp . IsZero ( ) {
return "<unknown>"
}
2017-02-19 22:37:24 +00:00
return printers . ShortHumanDuration ( time . Now ( ) . Sub ( timestamp . Time ) )
2015-04-20 23:38:21 +00:00
}
2017-05-26 23:00:01 +00:00
var (
podSuccessConditions = [ ] metav1alpha1 . TableRowCondition { { Type : metav1alpha1 . RowCompleted , Status : metav1alpha1 . ConditionTrue , Reason : string ( api . PodSucceeded ) , Message : "The pod has completed successfully." } }
podFailedConditions = [ ] metav1alpha1 . TableRowCondition { { Type : metav1alpha1 . RowCompleted , Status : metav1alpha1 . ConditionTrue , Reason : string ( api . PodFailed ) , Message : "The pod failed." } }
)
2015-05-20 19:51:35 +00:00
2017-05-26 23:00:01 +00:00
func printPodList ( podList * api . PodList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . 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 ) ( [ ] metav1alpha1 . TableRow , error ) {
2015-05-30 01:42:44 +00:00
restarts := 0
totalContainers := len ( pod . Spec . Containers )
readyContainers := 0
2015-06-09 15:58:16 +00:00
2015-05-30 01:42:44 +00:00
reason := string ( pod . Status . Phase )
2015-06-09 15:58:16 +00:00
if pod . Status . Reason != "" {
reason = pod . Status . Reason
}
2015-05-30 01:42:44 +00:00
2017-05-26 23:00:01 +00:00
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : pod } ,
}
switch pod . Status . Phase {
case api . PodSucceeded :
row . Conditions = podSuccessConditions
case api . PodFailed :
row . Conditions = podFailedConditions
}
2016-05-02 22:08:15 +00:00
initializing := false
for i := range pod . Status . InitContainerStatuses {
container := pod . Status . InitContainerStatuses [ i ]
2016-06-14 12:33:51 +00:00
restarts += int ( container . RestartCount )
2016-05-02 22:08:15 +00:00
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 )
}
2015-05-30 01:42:44 +00:00
} else {
2016-05-02 22:08:15 +00:00
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 {
2016-06-14 12:33:51 +00:00
restarts = 0
2016-05-02 22:08:15 +00:00
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 {
readyContainers ++
2015-04-20 23:38:21 +00:00
}
}
}
2016-11-01 19:59:06 +00:00
if pod . DeletionTimestamp != nil && pod . Status . Reason == node . NodeUnreachablePodReason {
reason = "Unknown"
} else if pod . DeletionTimestamp != nil {
2015-08-20 01:52:34 +00:00
reason = "Terminating"
}
2015-04-20 23:38:21 +00:00
2017-05-26 23:00:01 +00:00
row . Cells = append ( row . Cells , pod . Name , fmt . Sprintf ( "%d/%d" , readyContainers , totalContainers ) , reason , restarts , translateTimestamp ( pod . CreationTimestamp ) )
2015-06-29 18:36:06 +00:00
2016-01-20 15:39:15 +00:00
if options . Wide {
2015-06-29 18:36:06 +00:00
nodeName := pod . Spec . NodeName
2016-05-12 04:30:25 +00:00
podIP := pod . Status . PodIP
if podIP == "" {
podIP = "<none>"
}
2017-05-10 04:53:14 +00:00
if nodeName == "" {
nodeName = "<none>"
}
2017-05-26 23:00:01 +00:00
row . Cells = append ( row . Cells , podIP , nodeName )
2016-02-04 07:08:44 +00:00
}
2017-05-26 23:00:01 +00:00
return [ ] metav1alpha1 . TableRow { row } , nil
2014-10-06 01:24:19 +00:00
}
2017-06-24 22:31:36 +00:00
func printPodTemplate ( obj * api . PodTemplate , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2016-02-04 07:08:44 +00:00
}
2017-06-24 22:31:36 +00:00
names , images := layoutContainerCells ( obj . Template . Spec . Containers )
row . Cells = append ( row . Cells , obj . Name , names , images , labels . FormatLabels ( obj . Template . Labels ) )
return [ ] metav1alpha1 . TableRow { row } , nil
2015-03-04 00:54:17 +00:00
}
2017-06-24 22:31:36 +00:00
func printPodTemplateList ( list * api . PodTemplateList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printPodTemplate ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2015-03-04 00:54:17 +00:00
}
2017-06-24 22:31:36 +00:00
rows = append ( rows , r ... )
2015-03-04 00:54:17 +00:00
}
2017-06-24 22:31:36 +00:00
return rows , nil
2015-03-04 00:54:17 +00:00
}
2017-06-24 22:31:36 +00:00
func printPodDisruptionBudget ( obj * policy . PodDisruptionBudget , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2016-10-21 11:57:49 +00:00
}
2017-05-15 23:50:23 +00:00
var minAvailable string
var maxUnavailable string
2017-06-24 22:31:36 +00:00
if obj . Spec . MinAvailable != nil {
minAvailable = obj . Spec . MinAvailable . String ( )
2017-05-15 23:50:23 +00:00
} else {
minAvailable = "N/A"
}
2017-06-24 22:31:36 +00:00
if obj . Spec . MaxUnavailable != nil {
maxUnavailable = obj . Spec . MaxUnavailable . String ( )
2017-05-15 23:50:23 +00:00
} else {
maxUnavailable = "N/A"
}
2017-06-24 22:31:36 +00:00
row . Cells = append ( row . Cells , obj . Name , minAvailable , maxUnavailable , obj . Status . PodDisruptionsAllowed , translateTimestamp ( obj . CreationTimestamp ) )
return [ ] metav1alpha1 . TableRow { row } , nil
2016-10-21 11:57:49 +00:00
}
2017-06-24 22:31:36 +00:00
func printPodDisruptionBudgetList ( list * policy . PodDisruptionBudgetList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printPodDisruptionBudget ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2016-10-21 11:57:49 +00:00
}
2017-06-24 22:31:36 +00:00
rows = append ( rows , r ... )
2016-10-21 11:57:49 +00:00
}
2017-06-24 22:31:36 +00:00
return rows , nil
2016-10-21 11:57:49 +00:00
}
2016-03-11 05:29:37 +00:00
// TODO(AdoHe): try to put wide output in a single method
2017-06-24 22:31:36 +00:00
func printReplicationController ( obj * api . ReplicationController , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2015-07-01 20:56:31 +00:00
}
2016-02-23 15:11:19 +00:00
2017-06-24 22:31:36 +00:00
desiredReplicas := obj . Spec . Replicas
currentReplicas := obj . Status . Replicas
readyReplicas := obj . Status . ReadyReplicas
2016-03-11 05:29:37 +00:00
2017-06-24 22:31:36 +00:00
row . Cells = append ( row . Cells , obj . Name , desiredReplicas , currentReplicas , readyReplicas , translateTimestamp ( obj . CreationTimestamp ) )
2016-02-14 08:14:20 +00:00
if options . Wide {
2017-06-24 22:31:36 +00:00
names , images := layoutContainerCells ( obj . Spec . Template . Spec . Containers )
row . Cells = append ( row . Cells , names , images , labels . FormatLabels ( obj . Spec . Selector ) )
2016-02-04 07:08:44 +00:00
}
2017-06-24 22:31:36 +00:00
return [ ] metav1alpha1 . TableRow { row } , nil
2014-10-06 01:24:19 +00:00
}
2017-06-24 22:31:36 +00:00
func printReplicationControllerList ( list * api . ReplicationControllerList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printReplicationController ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2014-10-06 01:24:19 +00:00
}
2017-06-24 22:31:36 +00:00
rows = append ( rows , r ... )
2014-10-06 01:24:19 +00:00
}
2017-06-24 22:31:36 +00:00
return rows , nil
2014-10-06 01:24:19 +00:00
}
2017-06-24 22:31:36 +00:00
func printReplicaSet ( obj * extensions . ReplicaSet , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2016-02-09 05:23:56 +00:00
}
2016-02-23 15:11:19 +00:00
2017-06-24 22:31:36 +00:00
desiredReplicas := obj . Spec . Replicas
currentReplicas := obj . Status . Replicas
readyReplicas := obj . Status . ReadyReplicas
row . Cells = append ( row . Cells , obj . Name , desiredReplicas , currentReplicas , readyReplicas , translateTimestamp ( obj . CreationTimestamp ) )
2016-02-14 08:14:20 +00:00
if options . Wide {
2017-06-24 22:31:36 +00:00
names , images := layoutContainerCells ( obj . Spec . Template . Spec . Containers )
row . Cells = append ( row . Cells , names , images , metav1 . FormatLabelSelector ( obj . Spec . Selector ) )
2016-02-09 05:23:56 +00:00
}
2017-06-24 22:31:36 +00:00
return [ ] metav1alpha1 . TableRow { row } , nil
2016-02-09 05:23:56 +00:00
}
2017-06-24 22:31:36 +00:00
func printReplicaSetList ( list * extensions . ReplicaSetList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printReplicaSet ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2016-02-09 05:23:56 +00:00
}
2017-06-24 22:31:36 +00:00
rows = append ( rows , r ... )
2016-02-09 05:23:56 +00:00
}
2017-06-24 22:31:36 +00:00
return rows , nil
2016-02-09 05:23:56 +00:00
}
2017-07-28 06:50:05 +00:00
func printCluster ( obj * federation . Cluster , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
}
2016-07-22 22:01:59 +00:00
2016-04-26 14:33:47 +00:00
var statuses [ ] string
2017-07-28 06:50:05 +00:00
for _ , condition := range obj . Status . Conditions {
2016-04-26 14:33:47 +00:00
if condition . Status == api . ConditionTrue {
statuses = append ( statuses , string ( condition . Type ) )
} else {
statuses = append ( statuses , "Not" + string ( condition . Type ) )
}
}
if len ( statuses ) == 0 {
statuses = append ( statuses , "Unknown" )
}
2017-07-28 06:50:05 +00:00
row . Cells = append ( row . Cells , obj . Name , strings . Join ( statuses , "," ) , translateTimestamp ( obj . CreationTimestamp ) )
return [ ] metav1alpha1 . TableRow { row } , nil
2016-04-26 14:33:47 +00:00
}
2017-07-28 06:50:05 +00:00
func printClusterList ( list * federation . ClusterList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printCluster ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2016-04-26 14:33:47 +00:00
}
2017-07-28 06:50:05 +00:00
rows = append ( rows , r ... )
2016-04-26 14:33:47 +00:00
}
2017-07-28 06:50:05 +00:00
return rows , nil
2016-04-26 14:33:47 +00:00
}
2017-06-24 22:31:36 +00:00
func printJob ( obj * batch . Job , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2015-08-21 14:23:12 +00:00
}
2015-10-14 18:04:33 +00:00
2017-06-24 22:31:36 +00:00
var completions string
if obj . Spec . Completions != nil {
completions = strconv . Itoa ( int ( * obj . Spec . Completions ) )
2016-02-25 15:43:04 +00:00
} else {
2017-06-24 22:31:36 +00:00
completions = "<none>"
2015-08-21 14:23:12 +00:00
}
2017-06-24 22:31:36 +00:00
row . Cells = append ( row . Cells , obj . Name , completions , obj . Status . Succeeded , translateTimestamp ( obj . CreationTimestamp ) )
2016-02-14 08:14:20 +00:00
if options . Wide {
2017-06-24 22:31:36 +00:00
names , images := layoutContainerCells ( obj . Spec . Template . Spec . Containers )
row . Cells = append ( row . Cells , names , images , metav1 . FormatLabelSelector ( obj . Spec . Selector ) )
2016-02-04 07:08:44 +00:00
}
2017-06-24 22:31:36 +00:00
return [ ] metav1alpha1 . TableRow { row } , nil
2015-08-21 14:23:12 +00:00
}
2017-06-24 22:31:36 +00:00
func printJobList ( list * batch . JobList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printJob ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2015-08-21 14:23:12 +00:00
}
2017-06-24 22:31:36 +00:00
rows = append ( rows , r ... )
2015-08-21 14:23:12 +00:00
}
2017-06-24 22:31:36 +00:00
return rows , nil
2015-08-21 14:23:12 +00:00
}
2017-06-24 22:31:36 +00:00
func printCronJob ( obj * batch . CronJob , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2016-05-18 08:11:35 +00:00
}
lastScheduleTime := "<none>"
2017-06-24 22:31:36 +00:00
if obj . Status . LastScheduleTime != nil {
lastScheduleTime = obj . Status . LastScheduleTime . Time . Format ( time . RFC1123Z )
2016-05-18 08:11:35 +00:00
}
2017-06-24 22:31:36 +00:00
row . Cells = append ( row . Cells , obj . Name , obj . Spec . Schedule , printBoolPtr ( obj . Spec . Suspend ) , len ( obj . Status . Active ) , lastScheduleTime )
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 [ ] metav1alpha1 . TableRow { row } , nil
2016-05-18 08:11:35 +00:00
}
2017-06-24 22:31:36 +00:00
func printCronJobList ( list * batch . CronJobList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printCronJob ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2016-05-18 08:11:35 +00:00
}
2017-06-24 22:31:36 +00:00
rows = append ( rows , r ... )
2016-05-18 08:11:35 +00:00
}
2017-06-24 22:31:36 +00:00
return rows , nil
2016-05-18 08:11:35 +00:00
}
2016-06-02 23:09:51 +00:00
// 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 {
2015-09-23 21:50:59 +00:00
ingress := s . Ingress
2017-07-29 03:23:23 +00:00
result := sets . NewString ( )
2015-09-23 21:50:59 +00:00
for i := range ingress {
if ingress [ i ] . IP != "" {
2017-07-29 03:23:23 +00:00
result . Insert ( ingress [ i ] . IP )
2016-06-02 23:09:51 +00:00
} else if ingress [ i ] . Hostname != "" {
2017-07-29 03:23:23 +00:00
result . Insert ( ingress [ i ] . Hostname )
2015-09-23 21:50:59 +00:00
}
}
2017-07-29 03:23:23 +00:00
r := strings . Join ( result . List ( ) , "," )
2016-06-02 23:09:51 +00:00
if ! wide && len ( r ) > loadBalancerWidth {
r = r [ 0 : ( loadBalancerWidth - 3 ) ] + "..."
}
return r
2015-09-23 21:50:59 +00:00
}
2016-06-02 23:09:51 +00:00
func getServiceExternalIP ( svc * api . Service , wide bool ) string {
2015-08-08 04:08:43 +00:00
switch svc . Spec . Type {
case api . ServiceTypeClusterIP :
2015-08-12 00:18:21 +00:00
if len ( svc . Spec . ExternalIPs ) > 0 {
return strings . Join ( svc . Spec . ExternalIPs , "," )
}
2015-08-08 04:08:43 +00:00
return "<none>"
case api . ServiceTypeNodePort :
2015-08-12 00:18:21 +00:00
if len ( svc . Spec . ExternalIPs ) > 0 {
return strings . Join ( svc . Spec . ExternalIPs , "," )
}
2017-06-18 04:19:57 +00:00
return "<none>"
2015-08-08 04:08:43 +00:00
case api . ServiceTypeLoadBalancer :
2016-06-02 23:09:51 +00:00
lbIps := loadBalancerStatusStringer ( svc . Status . LoadBalancer , wide )
2015-08-12 00:18:21 +00:00
if len ( svc . Spec . ExternalIPs ) > 0 {
2017-06-23 16:10:33 +00:00
results := [ ] string { }
if len ( lbIps ) > 0 {
results = append ( results , strings . Split ( lbIps , "," ) ... )
}
results = append ( results , svc . Spec . ExternalIPs ... )
return strings . Join ( results , "," )
2015-08-12 00:18:21 +00:00
}
2016-04-21 07:35:32 +00:00
if len ( lbIps ) > 0 {
return lbIps
}
return "<pending>"
2016-08-23 13:51:17 +00:00
case api . ServiceTypeExternalName :
return svc . Spec . ExternalName
2015-08-08 04:08:43 +00:00
}
2016-04-21 07:35:32 +00:00
return "<unknown>"
2015-08-08 04:08:43 +00:00
}
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 )
2016-10-17 05:48:56 +00:00
if port . NodePort > 0 {
pieces [ ix ] = fmt . Sprintf ( "%d:%d/%s" , port . Port , port . NodePort , port . Protocol )
}
2015-08-08 04:08:43 +00:00
}
return strings . Join ( pieces , "," )
}
2017-07-21 07:42:30 +00:00
func printService ( obj * api . Service , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
}
svcType := obj . Spec . Type
internalIP := obj . Spec . ClusterIP
2017-06-08 11:55:23 +00:00
if len ( internalIP ) == 0 {
internalIP = "<none>"
}
2017-07-21 07:42:30 +00:00
externalIP := getServiceExternalIP ( obj , options . Wide )
svcPorts := makePortString ( obj . Spec . Ports )
2017-06-08 11:55:23 +00:00
if len ( svcPorts ) == 0 {
svcPorts = "<none>"
}
2015-05-20 19:51:35 +00:00
2017-07-21 07:42:30 +00:00
row . Cells = append ( row . Cells , obj . Name , string ( svcType ) , internalIP , externalIP , svcPorts , translateTimestamp ( obj . CreationTimestamp ) )
2016-02-14 08:14:20 +00:00
if options . Wide {
2017-07-21 07:42:30 +00:00
row . Cells = append ( row . Cells , labels . FormatLabels ( obj . Spec . Selector ) )
2015-06-16 16:30:11 +00:00
}
2017-07-21 07:42:30 +00:00
return [ ] metav1alpha1 . TableRow { row } , nil
2014-10-06 01:24:19 +00:00
}
2017-07-21 07:42:30 +00:00
func printServiceList ( list * api . ServiceList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printService ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2014-10-06 01:24:19 +00:00
}
2017-07-21 07:42:30 +00:00
rows = append ( rows , r ... )
2014-10-06 01:24:19 +00:00
}
2017-07-21 07:42:30 +00:00
return rows , nil
2014-10-06 01:24:19 +00:00
}
2015-09-23 21:50:59 +00:00
// backendStringer behaves just like a string interface and converts the given backend to a string.
2015-10-09 22:49:10 +00:00
func backendStringer ( backend * extensions . IngressBackend ) string {
2015-09-23 21:50:59 +00:00
if backend == nil {
return ""
}
return fmt . Sprintf ( "%v:%v" , backend . ServiceName , backend . ServicePort . String ( ) )
}
2016-06-05 02:43:51 +00:00
func formatHosts ( rules [ ] extensions . 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 [ ] extensions . IngressTLS ) string {
if len ( tls ) != 0 {
return "80, 443"
}
return "80"
}
2017-07-25 02:05:10 +00:00
func printIngress ( obj * extensions . Ingress , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2016-02-04 07:08:44 +00:00
}
2017-07-25 02:05:10 +00:00
hosts := formatHosts ( obj . Spec . Rules )
address := loadBalancerStatusStringer ( obj . Status . LoadBalancer , options . Wide )
ports := formatPorts ( obj . Spec . TLS )
createTime := translateTimestamp ( obj . CreationTimestamp )
row . Cells = append ( row . Cells , obj . Name , hosts , address , ports , createTime )
return [ ] metav1alpha1 . TableRow { row } , nil
2015-09-23 21:50:59 +00:00
}
2017-07-25 02:05:10 +00:00
func printIngressList ( list * extensions . IngressList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printIngress ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2015-09-23 21:50:59 +00:00
}
2017-07-25 02:05:10 +00:00
rows = append ( rows , r ... )
2015-09-23 21:50:59 +00:00
}
2017-07-25 02:05:10 +00:00
return rows , nil
2015-09-23 21:50:59 +00:00
}
2017-07-25 02:50:52 +00:00
func printStatefulSet ( obj * apps . StatefulSet , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2016-04-15 22:30:15 +00:00
}
2017-07-25 02:50:52 +00:00
desiredReplicas := obj . Spec . Replicas
currentReplicas := obj . Status . Replicas
createTime := translateTimestamp ( obj . CreationTimestamp )
row . Cells = append ( row . Cells , obj . Name , desiredReplicas , currentReplicas , createTime )
2016-04-15 22:30:15 +00:00
if options . Wide {
2017-07-25 02:50:52 +00:00
names , images := layoutContainerCells ( obj . Spec . Template . Spec . Containers )
row . Cells = append ( row . Cells , names , images )
2016-04-15 22:30:15 +00:00
}
2017-07-25 02:50:52 +00:00
return [ ] metav1alpha1 . TableRow { row } , nil
2016-04-15 22:30:15 +00:00
}
2017-07-25 02:50:52 +00:00
func printStatefulSetList ( list * apps . StatefulSetList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printStatefulSet ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2016-04-15 22:30:15 +00:00
}
2017-07-25 02:50:52 +00:00
rows = append ( rows , r ... )
2016-04-15 22:30:15 +00:00
}
2017-07-25 02:50:52 +00:00
return rows , nil
2016-04-15 22:30:15 +00:00
}
2017-06-25 17:01:14 +00:00
func printDaemonSet ( obj * extensions . DaemonSet , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2015-08-27 17:18:16 +00:00
}
2016-02-23 15:11:19 +00:00
2017-06-25 17:01:14 +00:00
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 , desiredScheduled , currentScheduled , numberReady , numberUpdated , numberAvailable , labels . FormatLabels ( obj . Spec . Template . Spec . NodeSelector ) , translateTimestamp ( obj . CreationTimestamp ) )
2016-02-14 08:14:20 +00:00
if options . Wide {
2017-06-25 17:01:14 +00:00
names , images := layoutContainerCells ( obj . Spec . Template . Spec . Containers )
row . Cells = append ( row . Cells , names , images , metav1 . FormatLabelSelector ( obj . Spec . Selector ) )
2016-02-04 07:08:44 +00:00
}
2017-06-25 17:01:14 +00:00
return [ ] metav1alpha1 . TableRow { row } , nil
2015-08-27 17:18:16 +00:00
}
2017-06-25 17:01:14 +00:00
func printDaemonSetList ( list * extensions . DaemonSetList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printDaemonSet ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2015-08-27 17:18:16 +00:00
}
2017-06-25 17:01:14 +00:00
rows = append ( rows , r ... )
2015-08-27 17:18:16 +00:00
}
2017-06-25 17:01:14 +00:00
return rows , nil
2015-08-27 17:18:16 +00:00
}
2017-07-25 03:04:37 +00:00
func printEndpoints ( obj * api . Endpoints , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2016-02-04 07:08:44 +00:00
}
2017-07-25 03:04:37 +00:00
row . Cells = append ( row . Cells , obj . Name , formatEndpoints ( obj , nil ) , translateTimestamp ( obj . CreationTimestamp ) )
return [ ] metav1alpha1 . TableRow { row } , nil
2015-02-05 23:45:53 +00:00
}
2017-07-25 03:04:37 +00:00
func printEndpointsList ( list * api . EndpointsList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printEndpoints ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2015-02-24 02:20:10 +00:00
}
2017-07-25 03:04:37 +00:00
rows = append ( rows , r ... )
2015-02-24 02:20:10 +00:00
}
2017-07-25 03:04:37 +00:00
return rows , nil
2015-02-24 02:20:10 +00:00
}
2017-07-27 08:04:33 +00:00
func printNamespace ( obj * api . Namespace , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2016-02-04 07:08:44 +00:00
}
2017-07-27 08:04:33 +00:00
row . Cells = append ( row . Cells , obj . Name , obj . Status . Phase , translateTimestamp ( obj . CreationTimestamp ) )
return [ ] metav1alpha1 . TableRow { row } , nil
2015-01-19 21:50:00 +00:00
}
2017-07-27 08:04:33 +00:00
func printNamespaceList ( list * api . NamespaceList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printNamespace ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2015-01-19 21:50:00 +00:00
}
2017-07-27 08:04:33 +00:00
rows = append ( rows , r ... )
2015-01-19 21:50:00 +00:00
}
2017-07-27 08:04:33 +00:00
return rows , nil
2015-01-19 21:50:00 +00:00
}
2017-07-27 08:14:27 +00:00
func printSecret ( obj * api . Secret , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
2017-07-27 08:10:57 +00:00
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2016-02-04 07:08:44 +00:00
}
2017-07-27 08:14:27 +00:00
row . Cells = append ( row . Cells , obj . Name , obj . Type , len ( obj . Data ) , translateTimestamp ( obj . CreationTimestamp ) )
2017-07-27 08:10:57 +00:00
return [ ] metav1alpha1 . TableRow { row } , nil
2015-02-18 01:24:50 +00:00
}
2017-07-28 13:21:11 +00:00
func printSecretList ( list * api . SecretList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
2017-07-27 08:10:57 +00:00
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printSecret ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2015-02-18 01:24:50 +00:00
}
2017-07-27 08:10:57 +00:00
rows = append ( rows , r ... )
2015-02-18 01:24:50 +00:00
}
2017-07-27 08:10:57 +00:00
return rows , nil
2015-02-18 01:24:50 +00:00
}
2017-07-27 08:14:27 +00:00
func printServiceAccount ( obj * api . ServiceAccount , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2016-02-04 07:08:44 +00:00
}
2017-07-27 08:14:27 +00:00
row . Cells = append ( row . Cells , obj . Name , len ( obj . Secrets ) , translateTimestamp ( obj . CreationTimestamp ) )
return [ ] metav1alpha1 . TableRow { row } , nil
2015-04-27 22:53:28 +00:00
}
2017-07-27 08:14:27 +00:00
func printServiceAccountList ( list * api . ServiceAccountList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printServiceAccount ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2015-04-27 22:53:28 +00:00
}
2017-07-27 08:14:27 +00:00
rows = append ( rows , r ... )
2015-04-27 22:53:28 +00:00
}
2017-07-27 08:14:27 +00:00
return rows , nil
2015-04-27 22:53:28 +00:00
}
2017-07-25 04:20:50 +00:00
func printNode ( obj * api . Node , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2015-07-01 20:41:54 +00:00
}
2017-07-25 04:20:50 +00:00
2015-02-24 05:21:14 +00:00
conditionMap := make ( map [ api . NodeConditionType ] * api . NodeCondition )
2015-04-03 13:43:51 +00:00
NodeAllConditions := [ ] api . NodeConditionType { api . NodeReady }
2017-07-25 04:20:50 +00:00
for i := range obj . Status . Conditions {
cond := obj . Status . Conditions [ i ]
2015-02-24 05:21:14 +00:00
conditionMap [ cond . Type ] = & cond
2015-01-15 01:11:34 +00:00
}
var status [ ] string
for _ , validCondition := range NodeAllConditions {
if condition , ok := conditionMap [ validCondition ] ; ok {
2015-03-23 18:33:55 +00:00
if condition . Status == api . ConditionTrue {
2015-02-24 05:21:14 +00:00
status = append ( status , string ( condition . Type ) )
2015-01-15 01:11:34 +00:00
} else {
2015-02-24 05:21:14 +00:00
status = append ( status , "Not" + string ( condition . Type ) )
2015-01-15 01:11:34 +00:00
}
}
}
if len ( status ) == 0 {
status = append ( status , "Unknown" )
}
2017-07-25 04:20:50 +00:00
if obj . Spec . Unschedulable {
2015-04-16 01:53:03 +00:00
status = append ( status , "SchedulingDisabled" )
}
2017-08-23 04:48:59 +00:00
roles := strings . Join ( findNodeRoles ( obj ) , "," )
if len ( roles ) == 0 {
roles = "<none>"
2017-07-18 20:43:47 +00:00
}
2015-06-16 16:30:11 +00:00
2017-08-23 04:48:59 +00:00
row . Cells = append ( row . Cells , obj . Name , strings . Join ( status , "," ) , roles , translateTimestamp ( obj . CreationTimestamp ) , obj . Status . NodeInfo . KubeletVersion )
2016-09-27 10:31:37 +00:00
if options . Wide {
2017-07-25 04:20:50 +00:00
osImage , kernelVersion , crVersion := obj . Status . NodeInfo . OSImage , obj . Status . NodeInfo . KernelVersion , obj . Status . NodeInfo . ContainerRuntimeVersion
2016-12-16 05:42:59 +00:00
if osImage == "" {
osImage = "<unknown>"
}
if kernelVersion == "" {
kernelVersion = "<unknown>"
}
2017-05-30 20:14:04 +00:00
if crVersion == "" {
crVersion = "<unknown>"
}
2017-07-25 04:20:50 +00:00
row . Cells = append ( row . Cells , getNodeExternalIP ( obj ) , osImage , kernelVersion , crVersion )
2015-06-16 16:30:11 +00:00
}
2017-07-25 04:20:50 +00:00
return [ ] metav1alpha1 . TableRow { row } , nil
2014-10-06 01:24:19 +00:00
}
2016-09-27 10:31:37 +00:00
// 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>"
}
2017-08-23 04:48:59 +00:00
// 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 )
}
2017-07-18 20:43:47 +00:00
}
2017-08-23 04:48:59 +00:00
return roles . List ( )
2017-07-18 20:43:47 +00:00
}
2017-07-25 04:20:50 +00:00
func printNodeList ( list * api . NodeList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printNode ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2014-10-06 01:24:19 +00:00
}
2017-07-25 04:20:50 +00:00
rows = append ( rows , r ... )
2014-10-06 01:24:19 +00:00
}
2017-07-25 04:20:50 +00:00
return rows , nil
2014-10-06 01:24:19 +00:00
}
2017-07-27 08:26:54 +00:00
func printPersistentVolume ( obj * api . PersistentVolume , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2015-05-20 19:51:35 +00:00
}
2015-03-26 19:50:36 +00:00
claimRefUID := ""
2017-07-27 08:26:54 +00:00
if obj . Spec . ClaimRef != nil {
claimRefUID += obj . Spec . ClaimRef . Namespace
2015-05-13 00:44:29 +00:00
claimRefUID += "/"
2017-07-27 08:26:54 +00:00
claimRefUID += obj . Spec . ClaimRef . Name
2015-03-26 19:50:36 +00:00
}
2017-07-27 08:26:54 +00:00
modesStr := helper . GetAccessModesAsString ( obj . Spec . AccessModes )
reclaimPolicyStr := string ( obj . Spec . PersistentVolumeReclaimPolicy )
2015-03-26 19:50:36 +00:00
2017-07-27 08:26:54 +00:00
aQty := obj . Spec . Capacity [ api . ResourceStorage ]
2015-08-11 03:55:15 +00:00
aSize := aQty . String ( )
2015-03-26 19:50:36 +00:00
2017-07-27 08:26:54 +00:00
row . Cells = append ( row . Cells , obj . Name , aSize , modesStr , reclaimPolicyStr ,
obj . Status . Phase , claimRefUID , helper . GetPersistentVolumeClass ( obj ) ,
obj . Status . Reason ,
translateTimestamp ( obj . CreationTimestamp ) )
return [ ] metav1alpha1 . TableRow { row } , nil
2015-03-26 19:50:36 +00:00
}
2017-07-27 08:26:54 +00:00
func printPersistentVolumeList ( list * api . PersistentVolumeList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printPersistentVolume ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2015-03-26 19:50:36 +00:00
}
2017-07-27 08:26:54 +00:00
rows = append ( rows , r ... )
2015-03-26 19:50:36 +00:00
}
2017-07-27 08:26:54 +00:00
return rows , nil
2015-03-26 19:50:36 +00:00
}
2017-07-27 08:34:23 +00:00
func printPersistentVolumeClaim ( obj * api . PersistentVolumeClaim , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2015-05-20 19:51:35 +00:00
}
2017-07-27 08:34:23 +00:00
phase := obj . Status . Phase
storage := obj . Spec . Resources . Requests [ api . ResourceStorage ]
2015-08-11 03:55:15 +00:00
capacity := ""
accessModes := ""
2017-07-27 08:34:23 +00:00
if obj . Spec . VolumeName != "" {
accessModes = helper . GetAccessModesAsString ( obj . Status . AccessModes )
storage = obj . Status . Capacity [ api . ResourceStorage ]
2015-08-11 03:55:15 +00:00
capacity = storage . String ( )
2015-07-01 20:56:31 +00:00
}
2015-06-18 06:32:03 +00:00
2017-07-27 08:34:23 +00:00
row . Cells = append ( row . Cells , obj . Name , phase , obj . Spec . VolumeName , capacity , accessModes , helper . GetPersistentVolumeClaimClass ( obj ) , translateTimestamp ( obj . CreationTimestamp ) )
return [ ] metav1alpha1 . TableRow { row } , nil
2015-03-26 19:50:36 +00:00
}
2017-07-27 08:34:23 +00:00
func printPersistentVolumeClaimList ( list * api . PersistentVolumeClaimList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printPersistentVolumeClaim ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2015-03-26 19:50:36 +00:00
}
2017-07-27 08:34:23 +00:00
rows = append ( rows , r ... )
2015-03-26 19:50:36 +00:00
}
2017-07-27 08:34:23 +00:00
return rows , nil
2015-03-26 19:50:36 +00:00
}
2017-07-27 07:37:18 +00:00
func printEvent ( obj * api . Event , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2015-07-01 20:41:54 +00:00
}
2015-11-10 11:34:28 +00:00
// While watching event, we should print absolute time.
var FirstTimestamp , LastTimestamp string
2016-01-20 15:39:15 +00:00
if options . AbsoluteTimestamps {
2017-07-27 07:37:18 +00:00
FirstTimestamp = obj . FirstTimestamp . String ( )
LastTimestamp = obj . LastTimestamp . String ( )
2015-11-10 11:34:28 +00:00
} else {
2017-07-27 07:37:18 +00:00
FirstTimestamp = translateTimestamp ( obj . FirstTimestamp )
LastTimestamp = translateTimestamp ( obj . LastTimestamp )
2015-11-10 11:34:28 +00:00
}
2017-07-27 07:37:18 +00:00
row . Cells = append ( row . Cells , LastTimestamp , FirstTimestamp ,
obj . Count , obj . Name , obj . InvolvedObject . Kind ,
obj . InvolvedObject . FieldPath , obj . Type , obj . Reason ,
formatEventSource ( obj . Source ) , obj . Message )
2015-11-10 11:34:28 +00:00
2017-07-27 07:37:18 +00:00
return [ ] metav1alpha1 . TableRow { row } , nil
2014-11-04 02:02:27 +00:00
}
2014-12-16 22:20:51 +00:00
// Sorts and prints the EventList in a human-friendly format.
2017-07-27 07:37:18 +00:00
func printEventList ( list * api . EventList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
2016-09-15 15:56:40 +00:00
sort . Sort ( events . SortableEvents ( list . Items ) )
2017-07-27 07:37:18 +00:00
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
2014-11-04 02:02:27 +00:00
for i := range list . Items {
2017-07-27 07:37:18 +00:00
r , err := printEvent ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2014-11-04 02:02:27 +00:00
}
2017-07-27 07:37:18 +00:00
rows = append ( rows , r ... )
2014-11-04 02:02:27 +00:00
}
2017-07-27 07:37:18 +00:00
return rows , nil
2014-11-04 02:02:27 +00:00
}
2017-07-28 07:20:13 +00:00
func printRoleBinding ( obj * rbac . RoleBinding , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2016-11-08 08:19:57 +00:00
}
2017-07-28 07:20:13 +00:00
row . Cells = append ( row . Cells , obj . Name , translateTimestamp ( obj . CreationTimestamp ) )
2016-11-08 08:19:57 +00:00
if options . Wide {
2017-07-28 07:20:13 +00:00
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 , ", " ) )
2016-11-08 08:19:57 +00:00
}
2017-07-28 07:20:13 +00:00
return [ ] metav1alpha1 . TableRow { row } , nil
2016-06-06 23:59:19 +00:00
}
// Prints the RoleBinding in a human-friendly format.
2017-07-28 07:20:13 +00:00
func printRoleBindingList ( list * rbac . RoleBindingList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
2016-06-06 23:59:19 +00:00
for i := range list . Items {
2017-07-28 07:20:13 +00:00
r , err := printRoleBinding ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2016-06-06 23:59:19 +00:00
}
2017-07-28 07:20:13 +00:00
rows = append ( rows , r ... )
2015-06-16 16:30:11 +00:00
}
2017-07-28 07:20:13 +00:00
return rows , nil
2016-06-06 23:59:19 +00:00
}
2017-07-28 07:20:13 +00:00
func printClusterRoleBinding ( obj * rbac . ClusterRoleBinding , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2016-11-08 08:19:57 +00:00
}
2017-07-28 07:20:13 +00:00
row . Cells = append ( row . Cells , obj . Name , translateTimestamp ( obj . CreationTimestamp ) )
2016-11-08 08:19:57 +00:00
if options . Wide {
2017-07-28 07:20:13 +00:00
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 , ", " ) )
2016-11-08 08:19:57 +00:00
}
2017-07-28 07:20:13 +00:00
return [ ] metav1alpha1 . TableRow { row } , nil
2016-06-06 23:59:19 +00:00
}
// Prints the ClusterRoleBinding in a human-friendly format.
2017-07-28 07:20:13 +00:00
func printClusterRoleBindingList ( list * rbac . ClusterRoleBindingList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
2015-01-23 17:38:30 +00:00
for i := range list . Items {
2017-07-28 07:20:13 +00:00
r , err := printClusterRoleBinding ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2015-01-23 17:38:30 +00:00
}
2017-07-28 07:20:13 +00:00
rows = append ( rows , r ... )
2015-01-23 17:38:30 +00:00
}
2017-07-28 07:20:13 +00:00
return rows , nil
2015-01-23 17:38:30 +00:00
}
2017-07-28 07:31:20 +00:00
func printCertificateSigningRequest ( obj * certificates . CertificateSigningRequest , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2016-08-05 21:46:20 +00:00
}
2017-07-28 07:31:20 +00:00
status , err := extractCSRStatus ( obj )
if err != nil {
return nil , err
2016-08-05 21:46:20 +00:00
}
2017-07-28 07:31:20 +00:00
row . Cells = append ( row . Cells , obj . Name , translateTimestamp ( obj . CreationTimestamp ) , obj . Spec . Username , status )
return [ ] metav1alpha1 . TableRow { row } , nil
2016-08-05 21:46:20 +00:00
}
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 :
2016-08-30 21:46:06 +00:00
return "" , fmt . Errorf ( "unknown csr condition %q" , c )
2016-08-05 21:46:20 +00:00
}
}
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
}
2017-07-28 07:31:20 +00:00
func printCertificateSigningRequestList ( list * certificates . CertificateSigningRequestList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
2016-08-05 21:46:20 +00:00
for i := range list . Items {
2017-07-28 07:31:20 +00:00
r , err := printCertificateSigningRequest ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2016-08-05 21:46:20 +00:00
}
2017-07-28 07:31:20 +00:00
rows = append ( rows , r ... )
2016-08-05 21:46:20 +00:00
}
2017-07-28 07:31:20 +00:00
return rows , nil
2016-08-05 21:46:20 +00:00
}
2017-07-27 08:57:58 +00:00
func printComponentStatus ( obj * api . ComponentStatus , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2015-07-01 20:41:54 +00:00
}
2015-04-15 19:23:02 +00:00
status := "Unknown"
message := ""
error := ""
2017-07-27 08:57:58 +00:00
for _ , condition := range obj . Conditions {
2015-04-15 19:23:02 +00:00
if condition . Type == api . ComponentHealthy {
if condition . Status == api . ConditionTrue {
status = "Healthy"
} else {
status = "Unhealthy"
}
message = condition . Message
error = condition . Error
break
}
}
2017-07-27 08:57:58 +00:00
row . Cells = append ( row . Cells , obj . Name , status , message , error )
return [ ] metav1alpha1 . TableRow { row } , nil
2015-04-15 19:23:02 +00:00
}
2017-07-27 08:57:58 +00:00
func printComponentStatusList ( list * api . ComponentStatusList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printComponentStatus ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2015-04-15 19:23:02 +00:00
}
2017-07-27 08:57:58 +00:00
rows = append ( rows , r ... )
2015-04-15 19:23:02 +00:00
}
2017-07-27 08:57:58 +00:00
return rows , nil
2015-04-15 19:23:02 +00:00
}
2017-07-27 09:22:48 +00:00
func printThirdPartyResource ( obj * extensions . ThirdPartyResource , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
}
2016-06-29 22:02:08 +00:00
2017-07-27 09:22:48 +00:00
versions := make ( [ ] string , len ( obj . Versions ) )
for ix := range obj . Versions {
version := & obj . Versions [ ix ]
2016-03-10 04:06:31 +00:00
versions [ ix ] = fmt . Sprintf ( "%s" , version . Name )
2015-08-15 05:10:15 +00:00
}
versionsString := strings . Join ( versions , "," )
2017-07-27 09:22:48 +00:00
row . Cells = append ( row . Cells , obj . Name , obj . Description , versionsString )
return [ ] metav1alpha1 . TableRow { row } , nil
2015-08-15 05:10:15 +00:00
}
2017-07-27 09:22:48 +00:00
func printThirdPartyResourceList ( list * extensions . ThirdPartyResourceList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printThirdPartyResource ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2015-08-15 05:10:15 +00:00
}
2017-07-27 09:22:48 +00:00
rows = append ( rows , r ... )
2015-08-15 05:10:15 +00:00
}
2017-07-27 09:22:48 +00:00
return rows , nil
2015-08-15 05:10:15 +00:00
}
2016-03-10 01:27:19 +00:00
func truncate ( str string , maxLen int ) string {
if len ( str ) > maxLen {
return str [ 0 : maxLen ] + "..."
}
return str
}
2017-07-27 09:22:48 +00:00
func printDeployment ( obj * extensions . Deployment , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2015-08-31 21:43:24 +00:00
}
2017-07-27 09:22:48 +00:00
desiredReplicas := obj . Spec . Replicas
currentReplicas := obj . Status . Replicas
updatedReplicas := obj . Status . UpdatedReplicas
availableReplicas := obj . Status . AvailableReplicas
age := translateTimestamp ( obj . CreationTimestamp )
containers := obj . Spec . Template . Spec . Containers
selector , err := metav1 . LabelSelectorAsSelector ( obj . Spec . Selector )
2016-12-27 04:10:05 +00:00
if err != nil {
// this shouldn't happen if LabelSelector passed validation
2017-07-27 09:22:48 +00:00
return nil , err
2015-08-31 21:43:24 +00:00
}
2017-07-27 09:22:48 +00:00
row . Cells = append ( row . Cells , obj . Name , desiredReplicas , currentReplicas , updatedReplicas , availableReplicas , age )
2016-12-27 04:10:05 +00:00
if options . Wide {
2017-07-27 09:22:48 +00:00
containers , images := layoutContainerCells ( containers )
row . Cells = append ( row . Cells , containers , images , selector . String ( ) )
2016-02-04 07:08:44 +00:00
}
2017-07-27 09:22:48 +00:00
return [ ] metav1alpha1 . TableRow { row } , nil
2015-08-31 21:43:24 +00:00
}
2017-07-27 09:22:48 +00:00
func printDeploymentList ( list * extensions . DeploymentList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printDeployment ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2015-08-31 21:43:24 +00:00
}
2017-07-27 09:22:48 +00:00
rows = append ( rows , r ... )
2015-08-31 21:43:24 +00:00
}
2017-07-27 09:22:48 +00:00
return rows , nil
2015-08-31 21:43:24 +00:00
}
2016-11-30 20:58:58 +00:00
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 . PodsMetricSourceType :
current := "<unknown>"
if len ( statuses ) > i && statuses [ i ] . Pods != nil {
current = statuses [ i ] . Pods . CurrentAverageValue . String ( )
}
list = append ( list , fmt . Sprintf ( "%s / %s" , current , spec . Pods . TargetAverageValue . String ( ) ) )
case autoscaling . ObjectMetricSourceType :
current := "<unknown>"
if len ( statuses ) > i && statuses [ i ] . Object != nil {
current = statuses [ i ] . Object . CurrentValue . String ( )
}
list = append ( list , fmt . Sprintf ( "%s / %s" , current , spec . Object . TargetValue . String ( ) ) )
case autoscaling . ResourceMetricSourceType :
if spec . Resource . TargetAverageValue != nil {
current := "<unknown>"
if len ( statuses ) > i && statuses [ i ] . Resource != nil {
current = statuses [ i ] . Resource . CurrentAverageValue . String ( )
}
list = append ( list , fmt . Sprintf ( "%s / %s" , current , spec . Resource . TargetAverageValue . String ( ) ) )
} else {
current := "<unknown>"
if len ( statuses ) > i && statuses [ i ] . Resource != nil && statuses [ i ] . Resource . CurrentAverageUtilization != nil {
current = fmt . Sprintf ( "%d%%" , * statuses [ i ] . Resource . CurrentAverageUtilization )
}
target := "<auto>"
if spec . Resource . TargetAverageUtilization != nil {
target = fmt . Sprintf ( "%d%%" , * spec . Resource . TargetAverageUtilization )
}
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
}
2017-07-27 10:02:54 +00:00
func printHorizontalPodAutoscaler ( obj * autoscaling . HorizontalPodAutoscaler , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
}
2016-06-29 22:02:08 +00:00
2016-05-05 10:27:24 +00:00
reference := fmt . Sprintf ( "%s/%s" ,
2017-07-27 10:02:54 +00:00
obj . Spec . ScaleTargetRef . Kind ,
obj . Spec . ScaleTargetRef . Name )
2015-10-21 00:30:56 +00:00
minPods := "<unset>"
2017-07-27 10:02:54 +00:00
metrics := formatHPAMetrics ( obj . Spec . Metrics , obj . Status . CurrentMetrics )
if obj . Spec . MinReplicas != nil {
minPods = fmt . Sprintf ( "%d" , * obj . Spec . MinReplicas )
2015-09-02 10:20:11 +00:00
}
2017-07-27 10:02:54 +00:00
maxPods := obj . Spec . MaxReplicas
currentReplicas := obj . Status . CurrentReplicas
row . Cells = append ( row . Cells , obj . Name , reference , metrics , minPods , maxPods , currentReplicas , translateTimestamp ( obj . CreationTimestamp ) )
return [ ] metav1alpha1 . TableRow { row } , nil
2015-09-02 10:20:11 +00:00
}
2017-07-27 10:02:54 +00:00
func printHorizontalPodAutoscalerList ( list * autoscaling . HorizontalPodAutoscalerList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
2015-09-02 10:20:11 +00:00
for i := range list . Items {
2017-07-27 10:02:54 +00:00
r , err := printHorizontalPodAutoscaler ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2015-09-02 10:20:11 +00:00
}
2017-07-27 10:02:54 +00:00
rows = append ( rows , r ... )
2015-09-02 10:20:11 +00:00
}
2017-07-27 10:02:54 +00:00
return rows , nil
2015-09-02 10:20:11 +00:00
}
2017-07-27 10:12:39 +00:00
func printConfigMap ( obj * api . ConfigMap , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2016-02-04 07:08:44 +00:00
}
2017-07-27 10:12:39 +00:00
row . Cells = append ( row . Cells , obj . Name , len ( obj . Data ) , translateTimestamp ( obj . CreationTimestamp ) )
return [ ] metav1alpha1 . TableRow { row } , nil
2015-12-15 15:09:42 +00:00
}
2017-07-27 10:12:39 +00:00
func printConfigMapList ( list * api . ConfigMapList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
2015-12-15 15:09:42 +00:00
for i := range list . Items {
2017-07-27 10:12:39 +00:00
r , err := printConfigMap ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2015-12-15 15:09:42 +00:00
}
2017-07-27 10:12:39 +00:00
rows = append ( rows , r ... )
2015-12-15 15:09:42 +00:00
}
2017-07-27 10:12:39 +00:00
return rows , nil
2015-12-15 15:09:42 +00:00
}
2017-07-28 06:34:32 +00:00
func printPodSecurityPolicy ( obj * extensions . PodSecurityPolicy , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
}
row . Cells = append ( row . Cells , obj . Name , obj . Spec . Privileged ,
obj . Spec . AllowedCapabilities , obj . Spec . SELinux . Rule ,
obj . Spec . RunAsUser . Rule , obj . Spec . FSGroup . Rule , obj . Spec . SupplementalGroups . Rule , obj . Spec . ReadOnlyRootFilesystem , obj . Spec . Volumes )
return [ ] metav1alpha1 . TableRow { row } , nil
2015-12-14 13:31:23 +00:00
}
2017-07-28 06:34:32 +00:00
func printPodSecurityPolicyList ( list * extensions . PodSecurityPolicyList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printPodSecurityPolicy ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2015-12-14 13:31:23 +00:00
}
2017-07-28 06:34:32 +00:00
rows = append ( rows , r ... )
2015-12-14 13:31:23 +00:00
}
2017-07-28 06:34:32 +00:00
return rows , nil
2015-12-14 13:31:23 +00:00
}
2017-07-28 07:20:13 +00:00
func printNetworkPolicy ( obj * networking . NetworkPolicy , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2017-03-13 14:31:16 +00:00
}
2017-07-28 07:20:13 +00:00
row . Cells = append ( row . Cells , obj . Name , metav1 . FormatLabelSelector ( & obj . Spec . PodSelector ) , translateTimestamp ( obj . CreationTimestamp ) )
return [ ] metav1alpha1 . TableRow { row } , nil
2017-03-13 14:31:16 +00:00
}
2017-07-28 07:20:13 +00:00
func printNetworkPolicyList ( list * networking . NetworkPolicyList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
2016-05-18 17:16:33 +00:00
for i := range list . Items {
2017-07-28 07:20:13 +00:00
r , err := printNetworkPolicy ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2016-05-18 17:16:33 +00:00
}
2017-07-28 07:20:13 +00:00
rows = append ( rows , r ... )
2016-05-18 17:16:33 +00:00
}
2017-07-28 07:20:13 +00:00
return rows , nil
2016-05-18 17:16:33 +00:00
}
2017-07-28 08:29:45 +00:00
func printStorageClass ( obj * storage . StorageClass , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2017-02-28 03:31:29 +00:00
}
2017-07-28 08:29:45 +00:00
name := obj . Name
if storageutil . IsDefaultAnnotation ( obj . ObjectMeta ) {
2016-10-12 19:49:16 +00:00
name += " (default)"
}
2017-07-28 08:29:45 +00:00
provtype := obj . Provisioner
row . Cells = append ( row . Cells , name , provtype )
2016-08-18 08:36:49 +00:00
2017-07-28 08:29:45 +00:00
return [ ] metav1alpha1 . TableRow { row } , nil
2016-08-18 08:36:49 +00:00
}
2017-07-28 08:29:45 +00:00
func printStorageClassList ( list * storage . StorageClassList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printStorageClass ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2016-08-18 08:36:49 +00:00
}
2017-07-28 08:29:45 +00:00
rows = append ( rows , r ... )
2016-08-18 08:36:49 +00:00
}
2017-07-28 08:29:45 +00:00
return rows , nil
2016-08-18 08:36:49 +00:00
}
2017-07-28 08:29:45 +00:00
func printStatus ( obj * metav1 . Status , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2016-10-28 18:15:14 +00:00
}
2017-07-28 08:29:45 +00:00
row . Cells = append ( row . Cells , obj . Status , obj . Reason , obj . Message )
2016-10-28 18:15:14 +00:00
2017-07-28 08:29:45 +00:00
return [ ] metav1alpha1 . TableRow { row } , nil
2016-10-28 18:15:14 +00:00
}
2017-07-25 02:50:52 +00:00
// Lay out all the containers on one line if use wide output.
2017-06-24 22:31:36 +00:00
// DEPRECATED: convert to TableHandler and use layoutContainerCells
2016-03-11 05:29:37 +00:00
func layoutContainers ( containers [ ] api . Container , w io . Writer ) error {
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 ( "," )
}
}
_ , err := fmt . Fprintf ( w , "\t%s\t%s" , namesBuffer . String ( ) , imagesBuffer . String ( ) )
if err != nil {
return err
}
return nil
}
2017-06-24 22:31:36 +00:00
// 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 ( )
}
2017-01-18 10:28:25 +00:00
// 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 , ", " )
}
2017-05-30 23:10:56 +00:00
2017-07-28 08:29:45 +00:00
func printControllerRevision ( obj * apps . ControllerRevision , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
row := metav1alpha1 . TableRow {
Object : runtime . RawExtension { Object : obj } ,
2017-05-30 23:10:56 +00:00
}
2017-08-02 09:41:33 +00:00
controllerRef := metav1 . GetControllerOf ( obj )
2017-05-30 23:10:56 +00:00
controllerName := "<none>"
if controllerRef != nil {
withKind := true
controllerName = printers . FormatResourceName ( controllerRef . Kind , controllerRef . Name , withKind )
}
2017-07-28 08:29:45 +00:00
revision := obj . Revision
age := translateTimestamp ( obj . CreationTimestamp )
row . Cells = append ( row . Cells , obj . Name , controllerName , revision , age )
return [ ] metav1alpha1 . TableRow { row } , nil
2017-05-30 23:10:56 +00:00
}
2017-07-28 08:29:45 +00:00
func printControllerRevisionList ( list * apps . ControllerRevisionList , options printers . PrintOptions ) ( [ ] metav1alpha1 . TableRow , error ) {
rows := make ( [ ] metav1alpha1 . TableRow , 0 , len ( list . Items ) )
for i := range list . Items {
r , err := printControllerRevision ( & list . Items [ i ] , options )
if err != nil {
return nil , err
2017-05-30 23:10:56 +00:00
}
2017-07-28 08:29:45 +00:00
rows = append ( rows , r ... )
2017-05-30 23:10:56 +00:00
}
2017-07-28 08:29:45 +00:00
return rows , nil
2017-05-30 23:10:56 +00:00
}