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