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 }