github.com/swisscom/cloudfoundry-cli@v7.1.0+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  func (actor Actor) GetDomains(orgGUID string) ([]Domain, Warnings, error) {
   118  	var (
   119  		allDomains  []Domain
   120  		allWarnings Warnings
   121  	)
   122  
   123  	sharedDomains, warnings, err := actor.CloudControllerClient.GetSharedDomains()
   124  	allWarnings = append(allWarnings, warnings...)
   125  	if err != nil {
   126  		return nil, allWarnings, err
   127  	}
   128  	for _, domain := range sharedDomains {
   129  		allDomains = append(allDomains, Domain(domain))
   130  	}
   131  
   132  	privateDomains, warnings, err := actor.CloudControllerClient.GetOrganizationPrivateDomains(orgGUID)
   133  	allWarnings = append(allWarnings, warnings...)
   134  	if err != nil {
   135  		return nil, allWarnings, err
   136  	}
   137  
   138  	for _, domain := range privateDomains {
   139  		allDomains = append(allDomains, Domain(domain))
   140  	}
   141  	return allDomains, allWarnings, err
   142  }
   143  
   144  // GetSharedDomain returns the shared domain associated with the provided
   145  // Domain GUID.
   146  func (actor Actor) GetSharedDomain(domainGUID string) (Domain, Warnings, error) {
   147  	if domain, found := actor.loadDomain(domainGUID); found {
   148  		log.WithFields(log.Fields{
   149  			"domain": domain.Name,
   150  			"GUID":   domain.GUID,
   151  		}).Debug("using domain from cache")
   152  		return domain, nil, nil
   153  	}
   154  
   155  	domain, warnings, err := actor.CloudControllerClient.GetSharedDomain(domainGUID)
   156  	if isResourceNotFoundError(err) {
   157  		return Domain{}, Warnings(warnings), actionerror.DomainNotFoundError{GUID: domainGUID}
   158  	}
   159  
   160  	actor.saveDomain(domain)
   161  	return Domain(domain), Warnings(warnings), err
   162  }
   163  
   164  // GetPrivateDomain returns the private domain associated with the provided
   165  // Domain GUID.
   166  func (actor Actor) GetPrivateDomain(domainGUID string) (Domain, Warnings, error) {
   167  	if domain, found := actor.loadDomain(domainGUID); found {
   168  		log.WithFields(log.Fields{
   169  			"domain": domain.Name,
   170  			"GUID":   domain.GUID,
   171  		}).Debug("using domain from cache")
   172  		return domain, nil, nil
   173  	}
   174  
   175  	domain, warnings, err := actor.CloudControllerClient.GetPrivateDomain(domainGUID)
   176  	if isResourceNotFoundError(err) {
   177  		return Domain{}, Warnings(warnings), actionerror.DomainNotFoundError{GUID: domainGUID}
   178  	}
   179  
   180  	actor.saveDomain(domain)
   181  	return Domain(domain), Warnings(warnings), err
   182  }
   183  
   184  // GetOrganizationDomains returns the shared and private domains associated
   185  // with an organization.
   186  func (actor Actor) GetOrganizationDomains(orgGUID string) ([]Domain, Warnings, error) {
   187  	var (
   188  		allWarnings Warnings
   189  		allDomains  []Domain
   190  	)
   191  
   192  	domains, warnings, err := actor.CloudControllerClient.GetSharedDomains()
   193  	allWarnings = append(allWarnings, warnings...)
   194  
   195  	if err != nil {
   196  		return []Domain{}, allWarnings, err
   197  	}
   198  	for _, domain := range domains {
   199  		allDomains = append(allDomains, Domain(domain))
   200  	}
   201  
   202  	domains, warnings, err = actor.CloudControllerClient.GetOrganizationPrivateDomains(orgGUID)
   203  	allWarnings = append(allWarnings, warnings...)
   204  
   205  	if err != nil {
   206  		return []Domain{}, allWarnings, err
   207  	}
   208  	for _, domain := range domains {
   209  		allDomains = append(allDomains, Domain(domain))
   210  	}
   211  
   212  	return allDomains, allWarnings, nil
   213  }
   214  
   215  func (actor Actor) saveDomain(domain ccv2.Domain) {
   216  	if domain.GUID != "" {
   217  		actor.domainCache[domain.GUID] = Domain(domain)
   218  	}
   219  }
   220  
   221  func (actor Actor) loadDomain(domainGUID string) (Domain, bool) {
   222  	domain, found := actor.domainCache[domainGUID]
   223  	return domain, found
   224  }