func DescribeClusterQuota(quota *quotaapi.ClusterResourceQuota) (string, error) { labelSelector, err := unversioned.LabelSelectorAsSelector(quota.Spec.Selector.LabelSelector) if err != nil { return "", err } return tabbedString(func(out *tabwriter.Writer) error { formatMeta(out, quota.ObjectMeta) fmt.Fprintf(out, "Label Selector: %s\n", labelSelector) fmt.Fprintf(out, "AnnotationSelector: %s\n", quota.Spec.Selector.AnnotationSelector) if len(quota.Spec.Quota.Scopes) > 0 { scopes := []string{} for _, scope := range quota.Spec.Quota.Scopes { scopes = append(scopes, string(scope)) } sort.Strings(scopes) fmt.Fprintf(out, "Scopes:\t%s\n", strings.Join(scopes, ", ")) } fmt.Fprintf(out, "Resource\tUsed\tHard\n") fmt.Fprintf(out, "--------\t----\t----\n") resources := []kapi.ResourceName{} for resource := range quota.Status.Total.Hard { resources = append(resources, resource) } sort.Sort(kctl.SortableResourceNames(resources)) msg := "%v\t%v\t%v\n" for i := range resources { resource := resources[i] hardQuantity := quota.Status.Total.Hard[resource] usedQuantity := quota.Status.Total.Used[resource] fmt.Fprintf(out, msg, resource, usedQuantity.String(), hardQuantity.String()) } return nil }) }
// Describe returns the description of a project func (d *ProjectDescriber) Describe(namespace, name string) (string, error) { projectsClient := d.osClient.Projects() project, err := projectsClient.Get(name) if err != nil { return "", err } resourceQuotasClient := d.kubeClient.ResourceQuotas(name) resourceQuotaList, err := resourceQuotasClient.List(labels.Everything()) if err != nil { return "", err } limitRangesClient := d.kubeClient.LimitRanges(name) limitRangeList, err := limitRangesClient.List(labels.Everything()) if err != nil { return "", err } nodeSelector := "" if len(project.ObjectMeta.Annotations) > 0 { if ns, ok := project.ObjectMeta.Annotations[projectapi.ProjectNodeSelector]; ok { nodeSelector = ns } } return tabbedString(func(out *tabwriter.Writer) error { formatMeta(out, project.ObjectMeta) formatString(out, "Display Name", project.Annotations[projectapi.ProjectDisplayName]) formatString(out, "Description", project.Annotations[projectapi.ProjectDescription]) formatString(out, "Status", project.Status.Phase) formatString(out, "Node Selector", nodeSelector) fmt.Fprintf(out, "\n") if len(resourceQuotaList.Items) == 0 { formatString(out, "Quota", "") } else { fmt.Fprintf(out, "Quota:\n") for i := range resourceQuotaList.Items { resourceQuota := &resourceQuotaList.Items[i] fmt.Fprintf(out, "\tName:\t%s\n", resourceQuota.Name) fmt.Fprintf(out, "\tResource\tUsed\tHard\n") fmt.Fprintf(out, "\t--------\t----\t----\n") resources := []kapi.ResourceName{} for resource := range resourceQuota.Status.Hard { resources = append(resources, resource) } sort.Sort(kctl.SortableResourceNames(resources)) msg := "\t%v\t%v\t%v\n" for i := range resources { resource := resources[i] hardQuantity := resourceQuota.Status.Hard[resource] usedQuantity := resourceQuota.Status.Used[resource] fmt.Fprintf(out, msg, resource, usedQuantity.String(), hardQuantity.String()) } } } fmt.Fprintf(out, "\n") if len(limitRangeList.Items) == 0 { formatString(out, "Resource limits", "") } else { fmt.Fprintf(out, "Resource limits:\n") for i := range limitRangeList.Items { limitRange := &limitRangeList.Items[i] fmt.Fprintf(out, "\tName:\t%s\n", limitRange.Name) fmt.Fprintf(out, "\tType\tResource\tMin\tMax\tDefault\n") fmt.Fprintf(out, "\t----\t--------\t---\t---\t---\n") for i := range limitRange.Spec.Limits { item := limitRange.Spec.Limits[i] maxResources := item.Max minResources := item.Min defaultResources := item.Default set := map[kapi.ResourceName]bool{} for k := range maxResources { set[k] = true } for k := range minResources { set[k] = true } for k := range defaultResources { set[k] = true } for k := range set { // if no value is set, we output - maxValue := "-" minValue := "-" defaultValue := "-" maxQuantity, maxQuantityFound := maxResources[k] if maxQuantityFound { maxValue = maxQuantity.String() } minQuantity, minQuantityFound := minResources[k] if minQuantityFound { minValue = minQuantity.String() } defaultQuantity, defaultQuantityFound := defaultResources[k] if defaultQuantityFound { defaultValue = defaultQuantity.String() } msg := "\t%v\t%v\t%v\t%v\t%v\n" fmt.Fprintf(out, msg, item.Type, k, minValue, maxValue, defaultValue) } } } } return nil }) }