github.com/cloudfoundry-attic/cli-with-i18n@v6.32.1-0.20171002233121-7401370d3b85+incompatible/actor/v2action/domain.go (about)

     1  package v2action
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
     7  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv2"
     8  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv2/constant"
     9  
    10  	log "github.com/sirupsen/logrus"
    11  )
    12  
    13  // Domain represents a CLI Domain.
    14  type Domain ccv2.Domain
    15  
    16  // IsHTTP returns true for any router group type that is not 'tcp'.
    17  func (domain Domain) IsHTTP() bool {
    18  	return !domain.IsTCP()
    19  }
    20  
    21  // IsTCP returns true only when the router group type equals 'tcp'.
    22  func (domain Domain) IsTCP() bool {
    23  	return domain.RouterGroupType == constant.TCPRouterGroup
    24  }
    25  
    26  // DomainNotFoundError is an error wrapper that represents the case
    27  // when the domain is not found.
    28  type DomainNotFoundError struct {
    29  	Name string
    30  	GUID string
    31  }
    32  
    33  // Error method to display the error message.
    34  func (e DomainNotFoundError) Error() string {
    35  	switch {
    36  	case e.Name != "":
    37  		return fmt.Sprintf("Domain %s not found", e.Name)
    38  	case e.GUID != "":
    39  		return fmt.Sprintf("Domain with GUID %s not found", e.GUID)
    40  	default:
    41  		return "Domain not found"
    42  	}
    43  }
    44  
    45  // TODO: Move into own file or add function to CCV2/3
    46  func isResourceNotFoundError(err error) bool {
    47  	_, isResourceNotFound := err.(ccerror.ResourceNotFoundError)
    48  	return isResourceNotFound
    49  }
    50  
    51  // GetDomain returns the shared or private domain associated with the provided
    52  // Domain GUID.
    53  func (actor Actor) GetDomain(domainGUID string) (Domain, Warnings, error) {
    54  	var allWarnings Warnings
    55  
    56  	domain, warnings, err := actor.GetSharedDomain(domainGUID)
    57  	allWarnings = append(allWarnings, warnings...)
    58  	switch err.(type) {
    59  	case nil:
    60  		return domain, allWarnings, nil
    61  	case DomainNotFoundError:
    62  	default:
    63  		return Domain{}, allWarnings, err
    64  	}
    65  
    66  	domain, warnings, err = actor.GetPrivateDomain(domainGUID)
    67  	allWarnings = append(allWarnings, warnings...)
    68  	switch err.(type) {
    69  	case nil:
    70  		return domain, allWarnings, nil
    71  	default:
    72  		return Domain{}, allWarnings, err
    73  	}
    74  }
    75  
    76  // GetDomainsByNameAndOrganization returns back a list of domains given a list
    77  // of domains and the organization GUID. If no domains are given, than this
    78  // command will not lookup any domains.
    79  func (actor Actor) GetDomainsByNameAndOrganization(domainNames []string, orgGUID string) ([]Domain, Warnings, error) {
    80  	if len(domainNames) == 0 {
    81  		return nil, nil, nil
    82  	}
    83  
    84  	var domains []Domain
    85  	var allWarnings Warnings
    86  
    87  	// TODO: If the following causes URI length problems, break domainNames into
    88  	// batched (based on character length?) and loop over them.
    89  
    90  	sharedDomains, warnings, err := actor.CloudControllerClient.GetSharedDomains(ccv2.Query{
    91  		Filter:   ccv2.NameFilter,
    92  		Operator: ccv2.InOperator,
    93  		Values:   domainNames,
    94  	})
    95  	allWarnings = append(allWarnings, warnings...)
    96  	if err != nil {
    97  		return nil, allWarnings, err
    98  	}
    99  
   100  	for _, domain := range sharedDomains {
   101  		domains = append(domains, Domain(domain))
   102  		actor.saveDomain(domain)
   103  	}
   104  
   105  	privateDomains, warnings, err := actor.CloudControllerClient.GetOrganizationPrivateDomains(
   106  		orgGUID,
   107  		ccv2.Query{
   108  			Filter:   ccv2.NameFilter,
   109  			Operator: ccv2.InOperator,
   110  			Values:   domainNames,
   111  		})
   112  	allWarnings = append(allWarnings, warnings...)
   113  	if err != nil {
   114  		return nil, allWarnings, err
   115  	}
   116  
   117  	for _, domain := range privateDomains {
   118  		domains = append(domains, Domain(domain))
   119  		actor.saveDomain(domain)
   120  	}
   121  
   122  	return domains, allWarnings, err
   123  }
   124  
   125  // GetSharedDomain returns the shared domain associated with the provided
   126  // Domain GUID.
   127  func (actor Actor) GetSharedDomain(domainGUID string) (Domain, Warnings, error) {
   128  	if domain, found := actor.loadDomain(domainGUID); found {
   129  		log.WithFields(log.Fields{
   130  			"domain": domain.Name,
   131  			"GUID":   domain.GUID,
   132  		}).Debug("using domain from cache")
   133  		return domain, nil, nil
   134  	}
   135  
   136  	domain, warnings, err := actor.CloudControllerClient.GetSharedDomain(domainGUID)
   137  	if isResourceNotFoundError(err) {
   138  		return Domain{}, Warnings(warnings), DomainNotFoundError{GUID: domainGUID}
   139  	}
   140  
   141  	actor.saveDomain(domain)
   142  	return Domain(domain), Warnings(warnings), err
   143  }
   144  
   145  // GetPrivateDomain returns the private domain associated with the provided
   146  // Domain GUID.
   147  func (actor Actor) GetPrivateDomain(domainGUID string) (Domain, Warnings, error) {
   148  	if domain, found := actor.loadDomain(domainGUID); found {
   149  		log.WithFields(log.Fields{
   150  			"domain": domain.Name,
   151  			"GUID":   domain.GUID,
   152  		}).Debug("using domain from cache")
   153  		return domain, nil, nil
   154  	}
   155  
   156  	domain, warnings, err := actor.CloudControllerClient.GetPrivateDomain(domainGUID)
   157  	if isResourceNotFoundError(err) {
   158  		return Domain{}, Warnings(warnings), DomainNotFoundError{GUID: domainGUID}
   159  	}
   160  
   161  	actor.saveDomain(domain)
   162  	return Domain(domain), Warnings(warnings), err
   163  }
   164  
   165  // GetOrganizationDomains returns the shared and private domains associated
   166  // with an organization.
   167  func (actor Actor) GetOrganizationDomains(orgGUID string) ([]Domain, Warnings, error) {
   168  	var (
   169  		allWarnings Warnings
   170  		allDomains  []Domain
   171  	)
   172  
   173  	domains, warnings, err := actor.CloudControllerClient.GetSharedDomains()
   174  	allWarnings = append(allWarnings, warnings...)
   175  
   176  	if err != nil {
   177  		return []Domain{}, allWarnings, err
   178  	}
   179  	for _, domain := range domains {
   180  		allDomains = append(allDomains, Domain(domain))
   181  	}
   182  
   183  	domains, warnings, err = actor.CloudControllerClient.GetOrganizationPrivateDomains(orgGUID)
   184  	allWarnings = append(allWarnings, warnings...)
   185  
   186  	if err != nil {
   187  		return []Domain{}, allWarnings, err
   188  	}
   189  	for _, domain := range domains {
   190  		allDomains = append(allDomains, Domain(domain))
   191  	}
   192  
   193  	return allDomains, allWarnings, nil
   194  }
   195  
   196  func (actor Actor) saveDomain(domain ccv2.Domain) {
   197  	if domain.GUID != "" {
   198  		actor.domainCache[domain.GUID] = Domain(domain)
   199  	}
   200  }
   201  
   202  func (actor Actor) loadDomain(domainGUID string) (Domain, bool) {
   203  	domain, found := actor.domainCache[domainGUID]
   204  	return domain, found
   205  }