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  }