@@ -40,7 +40,7 @@ func describerMap(c *client.Client, kclient kclient.Interface, host string) map[
40
40
"ImageStreamTag" : & ImageStreamTagDescriber {c },
41
41
"ImageStreamImage" : & ImageStreamImageDescriber {c },
42
42
"Route" : & RouteDescriber {c },
43
- "Project" : & ProjectDescriber {c },
43
+ "Project" : & ProjectDescriber {c , kclient },
44
44
"Template" : & TemplateDescriber {c , meta .NewAccessor (), kapi .Scheme , nil },
45
45
"Policy" : & PolicyDescriber {c },
46
46
"PolicyBinding" : & PolicyBindingDescriber {c },
@@ -457,16 +457,28 @@ func (d *RouteDescriber) Describe(namespace, name string) (string, error) {
457
457
458
458
// ProjectDescriber generates information about a Project
459
459
type ProjectDescriber struct {
460
- client.Interface
460
+ osClient client.Interface
461
+ kubeClient kclient.Interface
461
462
}
462
463
463
464
// Describe returns the description of a project
464
465
func (d * ProjectDescriber ) Describe (namespace , name string ) (string , error ) {
465
- c := d .Projects ()
466
- project , err := c .Get (name )
466
+ projectsClient := d .osClient .Projects ()
467
+ project , err := projectsClient .Get (name )
468
+ if err != nil {
469
+ return "" , err
470
+ }
471
+ resourceQuotasClient := d .kubeClient .ResourceQuotas (name )
472
+ resourceQuotaList , err := resourceQuotasClient .List (labels .Everything ())
467
473
if err != nil {
468
474
return "" , err
469
475
}
476
+ limitRangesClient := d .kubeClient .LimitRanges (name )
477
+ limitRangeList , err := limitRangesClient .List (labels .Everything ())
478
+ if err != nil {
479
+ return "" , err
480
+ }
481
+
470
482
nodeSelector := ""
471
483
if len (project .ObjectMeta .Annotations ) > 0 {
472
484
if ns , ok := project .ObjectMeta .Annotations ["openshift.io/node-selector" ]; ok {
@@ -477,8 +489,89 @@ func (d *ProjectDescriber) Describe(namespace, name string) (string, error) {
477
489
return tabbedString (func (out * tabwriter.Writer ) error {
478
490
formatMeta (out , project .ObjectMeta )
479
491
formatString (out , "Display Name" , project .Annotations ["displayName" ])
492
+ formatString (out , "Description" , project .Annotations ["description" ])
480
493
formatString (out , "Status" , project .Status .Phase )
481
494
formatString (out , "Node Selector" , nodeSelector )
495
+ fmt .Fprintf (out , "\n " )
496
+ if len (resourceQuotaList .Items ) == 0 {
497
+ formatString (out , "Quota" , "" )
498
+ } else {
499
+ fmt .Fprintf (out , "Quota:\n " )
500
+ for i := range resourceQuotaList .Items {
501
+ resourceQuota := & resourceQuotaList .Items [i ]
502
+ fmt .Fprintf (out , "\t Name:\t %s\n " , resourceQuota .Name )
503
+ fmt .Fprintf (out , "\t Resource\t Used\t Hard\n " )
504
+ fmt .Fprintf (out , "\t --------\t ----\t ----\n " )
505
+
506
+ resources := []kapi.ResourceName {}
507
+ for resource := range resourceQuota .Status .Hard {
508
+ resources = append (resources , resource )
509
+ }
510
+ sort .Sort (kctl .SortableResourceNames (resources ))
511
+
512
+ msg := "\t %v\t %v\t %v\n "
513
+ for i := range resources {
514
+ resource := resources [i ]
515
+ hardQuantity := resourceQuota .Status .Hard [resource ]
516
+ usedQuantity := resourceQuota .Status .Used [resource ]
517
+ fmt .Fprintf (out , msg , resource , usedQuantity .String (), hardQuantity .String ())
518
+ }
519
+ }
520
+ }
521
+ fmt .Fprintf (out , "\n " )
522
+ if len (limitRangeList .Items ) == 0 {
523
+ formatString (out , "Resource limits" , "" )
524
+ } else {
525
+ fmt .Fprintf (out , "Resource limits:\n " )
526
+ for i := range limitRangeList .Items {
527
+ limitRange := & limitRangeList .Items [i ]
528
+ fmt .Fprintf (out , "\t Name:\t %s\n " , limitRange .Name )
529
+ fmt .Fprintf (out , "\t Type\t Resource\t Min\t Max\t Default\n " )
530
+ fmt .Fprintf (out , "\t ----\t --------\t ---\t ---\t ---\n " )
531
+ for i := range limitRange .Spec .Limits {
532
+ item := limitRange .Spec .Limits [i ]
533
+ maxResources := item .Max
534
+ minResources := item .Min
535
+ defaultResources := item .Default
536
+
537
+ set := map [kapi.ResourceName ]bool {}
538
+ for k := range maxResources {
539
+ set [k ] = true
540
+ }
541
+ for k := range minResources {
542
+ set [k ] = true
543
+ }
544
+ for k := range defaultResources {
545
+ set [k ] = true
546
+ }
547
+
548
+ for k := range set {
549
+ // if no value is set, we output -
550
+ maxValue := "-"
551
+ minValue := "-"
552
+ defaultValue := "-"
553
+
554
+ maxQuantity , maxQuantityFound := maxResources [k ]
555
+ if maxQuantityFound {
556
+ maxValue = maxQuantity .String ()
557
+ }
558
+
559
+ minQuantity , minQuantityFound := minResources [k ]
560
+ if minQuantityFound {
561
+ minValue = minQuantity .String ()
562
+ }
563
+
564
+ defaultQuantity , defaultQuantityFound := defaultResources [k ]
565
+ if defaultQuantityFound {
566
+ defaultValue = defaultQuantity .String ()
567
+ }
568
+
569
+ msg := "\t %v\t %v\t %v\t %v\t %v\n "
570
+ fmt .Fprintf (out , msg , item .Type , k , minValue , maxValue , defaultValue )
571
+ }
572
+ }
573
+ }
574
+ }
482
575
return nil
483
576
})
484
577
}
0 commit comments