github.com/loggregator/cli@v6.33.1-0.20180224010324-82334f081791+incompatible/actor/v2action/domain.go (about)

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