github.com/orange-cloudfoundry/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  }