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