github.com/cloudfoundry-attic/cli-with-i18n@v6.32.1-0.20171002233121-7401370d3b85+incompatible/api/cloudcontroller/ccv2/security_group.go (about) 1 package ccv2 2 3 import ( 4 "encoding/json" 5 6 "code.cloudfoundry.org/cli/api/cloudcontroller" 7 "code.cloudfoundry.org/cli/api/cloudcontroller/ccerror" 8 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv2/internal" 9 ) 10 11 // SecurityGroupLifecycle represents the lifecycle phase of a security group 12 // binding. 13 type SecurityGroupLifecycle string 14 15 const ( 16 // SecurityGroupLifecycleRunning indicates the lifecycle phase running. 17 SecurityGroupLifecycleRunning SecurityGroupLifecycle = "running" 18 19 // SecurityGroupLifecycleStaging indicates the lifecycle phase staging. 20 SecurityGroupLifecycleStaging SecurityGroupLifecycle = "staging" 21 ) 22 23 type SecurityGroupRule struct { 24 Description string 25 Destination string 26 Ports string 27 Protocol string 28 } 29 30 type SecurityGroup struct { 31 GUID string 32 Name string 33 Rules []SecurityGroupRule 34 RunningDefault bool 35 StagingDefault bool 36 } 37 38 // UnmarshalJSON helps unmarshal a Cloud Controller Security Group response 39 func (securityGroup *SecurityGroup) UnmarshalJSON(data []byte) error { 40 var ccSecurityGroup struct { 41 Metadata internal.Metadata `json:"metadata"` 42 Entity struct { 43 GUID string `json:"guid"` 44 Name string `json:"name"` 45 Rules []struct { 46 Description string `json:"description"` 47 Destination string `json:"destination"` 48 Ports string `json:"ports"` 49 Protocol string `json:"protocol"` 50 } `json:"rules"` 51 RunningDefault bool `json:"running_default"` 52 StagingDefault bool `json:"staging_default"` 53 } `json:"entity"` 54 } 55 56 if err := json.Unmarshal(data, &ccSecurityGroup); err != nil { 57 return err 58 } 59 60 securityGroup.GUID = ccSecurityGroup.Metadata.GUID 61 securityGroup.Name = ccSecurityGroup.Entity.Name 62 securityGroup.Rules = make([]SecurityGroupRule, len(ccSecurityGroup.Entity.Rules)) 63 for i, ccRule := range ccSecurityGroup.Entity.Rules { 64 securityGroup.Rules[i].Description = ccRule.Description 65 securityGroup.Rules[i].Destination = ccRule.Destination 66 securityGroup.Rules[i].Ports = ccRule.Ports 67 securityGroup.Rules[i].Protocol = ccRule.Protocol 68 } 69 securityGroup.RunningDefault = ccSecurityGroup.Entity.RunningDefault 70 securityGroup.StagingDefault = ccSecurityGroup.Entity.StagingDefault 71 return nil 72 } 73 74 func (client *Client) AssociateSpaceWithRunningSecurityGroup(securityGroupGUID string, spaceGUID string) (Warnings, error) { 75 request, err := client.newHTTPRequest(requestOptions{ 76 RequestName: internal.PutRunningSecurityGroupSpaceRequest, 77 URIParams: Params{ 78 "security_group_guid": securityGroupGUID, 79 "space_guid": spaceGUID, 80 }, 81 }) 82 83 if err != nil { 84 return nil, err 85 } 86 87 response := cloudcontroller.Response{} 88 89 err = client.connection.Make(request, &response) 90 return response.Warnings, err 91 } 92 93 func (client *Client) AssociateSpaceWithStagingSecurityGroup(securityGroupGUID string, spaceGUID string) (Warnings, error) { 94 request, err := client.newHTTPRequest(requestOptions{ 95 RequestName: internal.PutStagingSecurityGroupSpaceRequest, 96 URIParams: Params{ 97 "security_group_guid": securityGroupGUID, 98 "space_guid": spaceGUID, 99 }, 100 }) 101 102 if err != nil { 103 return nil, err 104 } 105 106 response := cloudcontroller.Response{} 107 108 err = client.connection.Make(request, &response) 109 return response.Warnings, err 110 } 111 112 func (client *Client) GetSecurityGroups(queries ...Query) ([]SecurityGroup, Warnings, error) { 113 request, err := client.newHTTPRequest(requestOptions{ 114 RequestName: internal.GetSecurityGroupsRequest, 115 Query: FormatQueryParameters(queries), 116 }) 117 118 if err != nil { 119 return nil, nil, err 120 } 121 122 var securityGroupsList []SecurityGroup 123 warnings, err := client.paginate(request, SecurityGroup{}, func(item interface{}) error { 124 if securityGroup, ok := item.(SecurityGroup); ok { 125 securityGroupsList = append(securityGroupsList, securityGroup) 126 } else { 127 return ccerror.UnknownObjectInListError{ 128 Expected: SecurityGroup{}, 129 Unexpected: item, 130 } 131 } 132 return nil 133 }) 134 135 return securityGroupsList, warnings, err 136 } 137 138 // GetSpaceRunningSecurityGroupsBySpace returns the running Security Groups 139 // associated with the provided Space GUID. 140 func (client *Client) GetSpaceRunningSecurityGroupsBySpace(spaceGUID string, queries ...Query) ([]SecurityGroup, Warnings, error) { 141 return client.getSpaceSecurityGroupsBySpaceAndLifecycle(spaceGUID, internal.GetSpaceRunningSecurityGroupsRequest, queries) 142 } 143 144 // GetSpaceStagingSecurityGroupsBySpace returns the staging Security Groups 145 // associated with the provided Space GUID. 146 func (client *Client) GetSpaceStagingSecurityGroupsBySpace(spaceGUID string, queries ...Query) ([]SecurityGroup, Warnings, error) { 147 return client.getSpaceSecurityGroupsBySpaceAndLifecycle(spaceGUID, internal.GetSpaceStagingSecurityGroupsRequest, queries) 148 } 149 150 func (client *Client) getSpaceSecurityGroupsBySpaceAndLifecycle(spaceGUID string, lifecycle string, queries []Query) ([]SecurityGroup, Warnings, error) { 151 request, err := client.newHTTPRequest(requestOptions{ 152 RequestName: lifecycle, 153 URIParams: map[string]string{"space_guid": spaceGUID}, 154 Query: FormatQueryParameters(queries), 155 }) 156 if err != nil { 157 return nil, nil, err 158 } 159 160 var securityGroupsList []SecurityGroup 161 warnings, err := client.paginate(request, SecurityGroup{}, func(item interface{}) error { 162 if securityGroup, ok := item.(SecurityGroup); ok { 163 securityGroupsList = append(securityGroupsList, securityGroup) 164 } else { 165 return ccerror.UnknownObjectInListError{ 166 Expected: SecurityGroup{}, 167 Unexpected: item, 168 } 169 } 170 return err 171 }) 172 173 return securityGroupsList, warnings, err 174 } 175 176 // RemoveSpaceRunningFromSecurityGroup disassociates a security group in the 177 // running phase fo the lifecycle, specified by its GUID, from a space, which 178 // is also specified by its GUID. 179 func (client *Client) RemoveSpaceFromRunningSecurityGroup(securityGroupGUID string, spaceGUID string) (Warnings, error) { 180 request, err := client.newHTTPRequest(requestOptions{ 181 RequestName: internal.DeleteRunningSecurityGroupSpaceRequest, 182 URIParams: Params{ 183 "security_group_guid": securityGroupGUID, 184 "space_guid": spaceGUID, 185 }, 186 }) 187 188 if err != nil { 189 return nil, err 190 } 191 192 response := cloudcontroller.Response{} 193 194 err = client.connection.Make(request, &response) 195 return response.Warnings, err 196 } 197 198 // RemoveSpaceStagingFromSecurityGroup disassociates a security group in the 199 // staging phase fo the lifecycle, specified by its GUID, from a space, which 200 // is also specified by its GUID. 201 func (client *Client) RemoveSpaceFromStagingSecurityGroup(securityGroupGUID string, spaceGUID string) (Warnings, error) { 202 request, err := client.newHTTPRequest(requestOptions{ 203 RequestName: internal.DeleteStagingSecurityGroupSpaceRequest, 204 URIParams: Params{ 205 "security_group_guid": securityGroupGUID, 206 "space_guid": spaceGUID, 207 }, 208 }) 209 210 if err != nil { 211 return nil, err 212 } 213 214 response := cloudcontroller.Response{} 215 216 err = client.connection.Make(request, &response) 217 return response.Warnings, err 218 }