github.com/liamawhite/cli-with-i18n@v6.32.1-0.20171122084555-dede0a5c3448+incompatible/command/v2/org_command.go (about)

     1  package v2
     2  
     3  import (
     4  	"fmt"
     5  	"sort"
     6  	"strings"
     7  
     8  	"github.com/liamawhite/cli-with-i18n/actor/sharedaction"
     9  	"github.com/liamawhite/cli-with-i18n/actor/v2action"
    10  	"github.com/liamawhite/cli-with-i18n/actor/v3action"
    11  	"github.com/liamawhite/cli-with-i18n/api/cloudcontroller/ccversion"
    12  	"github.com/liamawhite/cli-with-i18n/command"
    13  	"github.com/liamawhite/cli-with-i18n/command/flag"
    14  	"github.com/liamawhite/cli-with-i18n/command/translatableerror"
    15  	"github.com/liamawhite/cli-with-i18n/command/v2/shared"
    16  	sharedV3 "github.com/liamawhite/cli-with-i18n/command/v3/shared"
    17  )
    18  
    19  //go:generate counterfeiter . OrgActor
    20  
    21  type OrgActor interface {
    22  	GetOrganizationByName(orgName string) (v2action.Organization, v2action.Warnings, error)
    23  	GetOrganizationSummaryByName(orgName string) (v2action.OrganizationSummary, v2action.Warnings, error)
    24  }
    25  
    26  //go:generate counterfeiter . OrgActorV3
    27  
    28  type OrgActorV3 interface {
    29  	GetIsolationSegmentsByOrganization(orgName string) ([]v3action.IsolationSegment, v3action.Warnings, error)
    30  	CloudControllerAPIVersion() string
    31  }
    32  
    33  type OrgCommand struct {
    34  	RequiredArgs    flag.Organization `positional-args:"yes"`
    35  	GUID            bool              `long:"guid" description:"Retrieve and display the given org's guid.  All other output for the org is suppressed."`
    36  	usage           interface{}       `usage:"CF_NAME org ORG [--guid]"`
    37  	relatedCommands interface{}       `related_commands:"org-users, orgs"`
    38  
    39  	UI          command.UI
    40  	Config      command.Config
    41  	SharedActor command.SharedActor
    42  	Actor       OrgActor
    43  	ActorV3     OrgActorV3
    44  }
    45  
    46  func (cmd *OrgCommand) Setup(config command.Config, ui command.UI) error {
    47  	cmd.Config = config
    48  	cmd.UI = ui
    49  	cmd.SharedActor = sharedaction.NewActor(config)
    50  
    51  	ccClient, uaaClient, err := shared.NewClients(config, ui, true)
    52  	if err != nil {
    53  		return err
    54  	}
    55  	cmd.Actor = v2action.NewActor(ccClient, uaaClient, config)
    56  
    57  	ccClientV3, _, err := sharedV3.NewClients(config, ui, true)
    58  	if err != nil {
    59  		if _, ok := err.(translatableerror.V3APIDoesNotExistError); !ok {
    60  			return err
    61  		}
    62  	} else {
    63  		cmd.ActorV3 = v3action.NewActor(nil, ccClientV3, config)
    64  	}
    65  
    66  	return nil
    67  }
    68  
    69  func (cmd OrgCommand) Execute(args []string) error {
    70  	err := cmd.SharedActor.CheckTarget(cmd.Config, false, false)
    71  	if err != nil {
    72  		return shared.HandleError(err)
    73  	}
    74  
    75  	if cmd.GUID {
    76  		return cmd.displayOrgGUID()
    77  	} else {
    78  		return cmd.displayOrgSummary()
    79  	}
    80  }
    81  
    82  func (cmd OrgCommand) displayOrgGUID() error {
    83  	org, warnings, err := cmd.Actor.GetOrganizationByName(cmd.RequiredArgs.Organization)
    84  	cmd.UI.DisplayWarnings(warnings)
    85  	if err != nil {
    86  		return shared.HandleError(err)
    87  	}
    88  
    89  	cmd.UI.DisplayText(org.GUID)
    90  
    91  	return nil
    92  }
    93  
    94  func (cmd OrgCommand) displayOrgSummary() error {
    95  	user, err := cmd.Config.CurrentUser()
    96  	if err != nil {
    97  		return shared.HandleError(err)
    98  	}
    99  
   100  	cmd.UI.DisplayTextWithFlavor(
   101  		"Getting info for org {{.OrgName}} as {{.Username}}...",
   102  		map[string]interface{}{
   103  			"OrgName":  cmd.RequiredArgs.Organization,
   104  			"Username": user.Name,
   105  		})
   106  	cmd.UI.DisplayNewline()
   107  
   108  	orgSummary, warnings, err := cmd.Actor.GetOrganizationSummaryByName(cmd.RequiredArgs.Organization)
   109  	cmd.UI.DisplayWarnings(warnings)
   110  	if err != nil {
   111  		return shared.HandleError(err)
   112  	}
   113  
   114  	table := [][]string{
   115  		{cmd.UI.TranslateText("name:"), orgSummary.Name},
   116  		{cmd.UI.TranslateText("domains:"), strings.Join(orgSummary.DomainNames, ", ")},
   117  		{cmd.UI.TranslateText("quota:"), orgSummary.QuotaName},
   118  		{cmd.UI.TranslateText("spaces:"), strings.Join(orgSummary.SpaceNames, ", ")},
   119  	}
   120  
   121  	if cmd.ActorV3 != nil {
   122  		apiCheck := command.MinimumAPIVersionCheck(cmd.ActorV3.CloudControllerAPIVersion(), ccversion.MinVersionIsolationSegmentV3)
   123  		if apiCheck == nil {
   124  			isolationSegments, v3Warnings, err := cmd.ActorV3.GetIsolationSegmentsByOrganization(orgSummary.GUID)
   125  			cmd.UI.DisplayWarnings(v3Warnings)
   126  			if err != nil {
   127  				return shared.HandleError(err)
   128  			}
   129  
   130  			isolationSegmentNames := []string{}
   131  			for _, iso := range isolationSegments {
   132  				if iso.GUID == orgSummary.DefaultIsolationSegmentGUID {
   133  					isolationSegmentNames = append(isolationSegmentNames, fmt.Sprintf("%s (%s)", iso.Name, cmd.UI.TranslateText("default")))
   134  				} else {
   135  					isolationSegmentNames = append(isolationSegmentNames, iso.Name)
   136  				}
   137  			}
   138  
   139  			sort.Strings(isolationSegmentNames)
   140  			table = append(table, []string{cmd.UI.TranslateText("isolation segments:"), strings.Join(isolationSegmentNames, ", ")})
   141  		}
   142  	}
   143  
   144  	cmd.UI.DisplayKeyValueTable("", table, 3)
   145  
   146  	return nil
   147  }