github.com/jghiloni/cli@v6.28.1-0.20170628223758-0ce05fe032a2+incompatible/actor/v2action/domain.go (about)

     1  package v2action
     2  
     3  import (
     4  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
     5  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv2"
     6  
     7  	log "github.com/sirupsen/logrus"
     8  )
     9  
    10  // Domain represents a CLI Domain.
    11  type Domain ccv2.Domain
    12  
    13  // DomainNotFoundError is an error wrapper that represents the case
    14  // when the domain is not found.
    15  type DomainNotFoundError struct{}
    16  
    17  // Error method to display the error message.
    18  func (_ DomainNotFoundError) Error() string {
    19  	return "Domain not found."
    20  }
    21  
    22  // TODO: Move into own file or add function to CCV2/3
    23  func isResourceNotFoundError(err error) bool {
    24  	_, isResourceNotFound := err.(ccerror.ResourceNotFoundError)
    25  	return isResourceNotFound
    26  }
    27  
    28  // GetDomain returns the shared or private domain associated with the provided
    29  // Domain GUID.
    30  func (actor Actor) GetDomain(domainGUID string) (Domain, Warnings, error) {
    31  	var allWarnings Warnings
    32  
    33  	domain, warnings, err := actor.GetSharedDomain(domainGUID)
    34  	allWarnings = append(allWarnings, warnings...)
    35  	switch err.(type) {
    36  	case nil:
    37  		return domain, allWarnings, nil
    38  	case DomainNotFoundError:
    39  	default:
    40  		return Domain{}, allWarnings, err
    41  	}
    42  
    43  	domain, warnings, err = actor.GetPrivateDomain(domainGUID)
    44  	allWarnings = append(allWarnings, warnings...)
    45  	switch err.(type) {
    46  	case nil:
    47  		return domain, allWarnings, nil
    48  	default:
    49  		return Domain{}, allWarnings, err
    50  	}
    51  }
    52  
    53  // GetSharedDomain returns the shared domain associated with the provided
    54  // Domain GUID.
    55  func (actor Actor) GetSharedDomain(domainGUID string) (Domain, Warnings, error) {
    56  	if domain, found := actor.loadDomain(domainGUID); found {
    57  		log.WithFields(log.Fields{
    58  			"domain": domain.Name,
    59  			"GUID":   domain.GUID,
    60  		}).Debug("using domain from cache")
    61  		return domain, nil, nil
    62  	}
    63  
    64  	domain, warnings, err := actor.CloudControllerClient.GetSharedDomain(domainGUID)
    65  	if isResourceNotFoundError(err) {
    66  		return Domain{}, Warnings(warnings), DomainNotFoundError{}
    67  	}
    68  
    69  	actor.saveDomain(domain)
    70  	return Domain(domain), Warnings(warnings), err
    71  }
    72  
    73  // GetPrivateDomain returns the private domain associated with the provided
    74  // Domain GUID.
    75  func (actor Actor) GetPrivateDomain(domainGUID string) (Domain, Warnings, error) {
    76  	if domain, found := actor.loadDomain(domainGUID); found {
    77  		log.WithFields(log.Fields{
    78  			"domain": domain.Name,
    79  			"GUID":   domain.GUID,
    80  		}).Debug("using domain from cache")
    81  		return domain, nil, nil
    82  	}
    83  
    84  	domain, warnings, err := actor.CloudControllerClient.GetPrivateDomain(domainGUID)
    85  	if isResourceNotFoundError(err) {
    86  		return Domain{}, Warnings(warnings), DomainNotFoundError{}
    87  	}
    88  
    89  	actor.saveDomain(domain)
    90  	return Domain(domain), Warnings(warnings), err
    91  }
    92  
    93  // GetOrganizationDomains returns the shared and private domains associated
    94  // with an organization.
    95  func (actor Actor) GetOrganizationDomains(orgGUID string) ([]Domain, Warnings, error) {
    96  	var allWarnings Warnings
    97  	var allDomains []Domain
    98  
    99  	domains, warnings, err := actor.CloudControllerClient.GetSharedDomains()
   100  	allWarnings = append(allWarnings, warnings...)
   101  
   102  	if err != nil {
   103  		return []Domain{}, allWarnings, err
   104  	}
   105  	for _, domain := range domains {
   106  		allDomains = append(allDomains, Domain(domain))
   107  	}
   108  
   109  	domains, warnings, err = actor.CloudControllerClient.GetOrganizationPrivateDomains(orgGUID, nil)
   110  	allWarnings = append(allWarnings, warnings...)
   111  
   112  	if err != nil {
   113  		return []Domain{}, allWarnings, err
   114  	}
   115  	for _, domain := range domains {
   116  		allDomains = append(allDomains, Domain(domain))
   117  	}
   118  
   119  	return allDomains, allWarnings, nil
   120  }
   121  
   122  func (actor Actor) saveDomain(domain ccv2.Domain) {
   123  	if domain.GUID != "" {
   124  		actor.domainCache[domain.GUID] = Domain(domain)
   125  	}
   126  }
   127  
   128  func (actor Actor) loadDomain(domainGUID string) (Domain, bool) {
   129  	domain, found := actor.domainCache[domainGUID]
   130  	return domain, found
   131  }