github.com/cloudfoundry-attic/cli-with-i18n@v6.32.1-0.20171002233121-7401370d3b85+incompatible/actor/cfnetworkingaction/policy.go (about) 1 package cfnetworkingaction 2 3 import ( 4 "code.cloudfoundry.org/cfnetworking-cli-api/cfnetworking/cfnetv1" 5 ) 6 7 type PolicyDoesNotExistError struct{} 8 9 func (e PolicyDoesNotExistError) Error() string { 10 return "Policy does not exist." 11 } 12 13 type Policy struct { 14 SourceName string 15 DestinationName string 16 Protocol string 17 StartPort int 18 EndPort int 19 } 20 21 func (actor Actor) AddNetworkPolicy(spaceGUID, srcAppName, destAppName, protocol string, startPort, endPort int) (Warnings, error) { 22 var allWarnings Warnings 23 24 srcApp, warnings, err := actor.V3Actor.GetApplicationByNameAndSpace(srcAppName, spaceGUID) 25 allWarnings = append(allWarnings, Warnings(warnings)...) 26 if err != nil { 27 return allWarnings, err 28 } 29 30 destApp, warnings, err := actor.V3Actor.GetApplicationByNameAndSpace(destAppName, spaceGUID) 31 allWarnings = append(allWarnings, Warnings(warnings)...) 32 if err != nil { 33 return allWarnings, err 34 } 35 36 err = actor.NetworkingClient.CreatePolicies([]cfnetv1.Policy{ 37 { 38 Source: cfnetv1.PolicySource{ 39 ID: srcApp.GUID, 40 }, 41 Destination: cfnetv1.PolicyDestination{ 42 ID: destApp.GUID, 43 Protocol: cfnetv1.PolicyProtocol(protocol), 44 Ports: cfnetv1.Ports{ 45 Start: startPort, 46 End: endPort, 47 }, 48 }, 49 }, 50 }) 51 return allWarnings, err 52 } 53 54 func (actor Actor) NetworkPoliciesBySpace(spaceGUID string) ([]Policy, Warnings, error) { 55 var allWarnings Warnings 56 57 applications, warnings, err := actor.V3Actor.GetApplicationsBySpace(spaceGUID) 58 allWarnings = append(allWarnings, Warnings(warnings)...) 59 if err != nil { 60 return []Policy{}, allWarnings, err 61 } 62 63 var v1Policies []cfnetv1.Policy 64 v1Policies, err = actor.NetworkingClient.ListPolicies() 65 if err != nil { 66 return []Policy{}, allWarnings, err 67 } 68 69 appNameByGuid := map[string]string{} 70 for _, app := range applications { 71 appNameByGuid[app.GUID] = app.Name 72 } 73 74 var policies []Policy 75 emptyPolicy := Policy{} 76 for _, v1Policy := range v1Policies { 77 policy := actor.transformPolicy(appNameByGuid, v1Policy) 78 if policy != emptyPolicy { 79 policies = append(policies, policy) 80 } 81 } 82 83 return policies, allWarnings, nil 84 } 85 86 func (actor Actor) NetworkPoliciesBySpaceAndAppName(spaceGUID string, srcAppName string) ([]Policy, Warnings, error) { 87 var allWarnings Warnings 88 var appGUID string 89 90 applications, warnings, err := actor.V3Actor.GetApplicationsBySpace(spaceGUID) 91 allWarnings = append(allWarnings, Warnings(warnings)...) 92 if err != nil { 93 return []Policy{}, allWarnings, err 94 } 95 96 appNameByGuid := map[string]string{} 97 for _, app := range applications { 98 appNameByGuid[app.GUID] = app.Name 99 } 100 101 var v1Policies []cfnetv1.Policy 102 103 srcApp, warnings, err := actor.V3Actor.GetApplicationByNameAndSpace(srcAppName, spaceGUID) 104 allWarnings = append(allWarnings, Warnings(warnings)...) 105 if err != nil { 106 return []Policy{}, allWarnings, err 107 } 108 109 appGUID = srcApp.GUID 110 v1Policies, err = actor.NetworkingClient.ListPolicies(appGUID) 111 if err != nil { 112 return []Policy{}, allWarnings, err 113 } 114 115 var policies []Policy 116 emptyPolicy := Policy{} 117 for _, v1Policy := range v1Policies { 118 if v1Policy.Source.ID == appGUID { 119 policy := actor.transformPolicy(appNameByGuid, v1Policy) 120 if policy != emptyPolicy { 121 policies = append(policies, policy) 122 } 123 } 124 } 125 126 return policies, allWarnings, nil 127 } 128 129 func (actor Actor) RemoveNetworkPolicy(spaceGUID, srcAppName, destAppName, protocol string, startPort, endPort int) (Warnings, error) { 130 var allWarnings Warnings 131 132 srcApp, warnings, err := actor.V3Actor.GetApplicationByNameAndSpace(srcAppName, spaceGUID) 133 allWarnings = append(allWarnings, Warnings(warnings)...) 134 if err != nil { 135 return allWarnings, err 136 } 137 138 destApp, warnings, err := actor.V3Actor.GetApplicationByNameAndSpace(destAppName, spaceGUID) 139 allWarnings = append(allWarnings, Warnings(warnings)...) 140 if err != nil { 141 return allWarnings, err 142 } 143 144 policyToRemove := cfnetv1.Policy{ 145 Source: cfnetv1.PolicySource{ 146 ID: srcApp.GUID, 147 }, 148 Destination: cfnetv1.PolicyDestination{ 149 ID: destApp.GUID, 150 Protocol: cfnetv1.PolicyProtocol(protocol), 151 Ports: cfnetv1.Ports{ 152 Start: startPort, 153 End: endPort, 154 }, 155 }, 156 } 157 158 v1Policies, err := actor.NetworkingClient.ListPolicies(srcApp.GUID) 159 if err != nil { 160 return allWarnings, err 161 } 162 163 for _, v1Policy := range v1Policies { 164 if v1Policy == policyToRemove { 165 return allWarnings, actor.NetworkingClient.RemovePolicies([]cfnetv1.Policy{policyToRemove}) 166 } 167 } 168 169 return allWarnings, PolicyDoesNotExistError{} 170 } 171 172 func (Actor) transformPolicy(appNameByGuid map[string]string, v1Policy cfnetv1.Policy) Policy { 173 srcName, srcOk := appNameByGuid[v1Policy.Source.ID] 174 dstName, dstOk := appNameByGuid[v1Policy.Destination.ID] 175 if srcOk && dstOk { 176 return Policy{ 177 SourceName: srcName, 178 DestinationName: dstName, 179 Protocol: string(v1Policy.Destination.Protocol), 180 StartPort: v1Policy.Destination.Ports.Start, 181 EndPort: v1Policy.Destination.Ports.End, 182 } 183 } 184 return Policy{} 185 }