github.com/liamawhite/cli-with-i18n@v6.32.1-0.20171122084555-dede0a5c3448+incompatible/actor/v2action/space.go (about)

     1  package v2action
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/liamawhite/cli-with-i18n/api/cloudcontroller/ccv2"
     7  )
     8  
     9  // Space represents a CLI Space
    10  type Space ccv2.Space
    11  
    12  // SpaceNotFoundError represents the scenario when the space searched for could
    13  // not be found.
    14  type SpaceNotFoundError struct {
    15  	GUID string
    16  	Name string
    17  }
    18  
    19  func (e SpaceNotFoundError) Error() string {
    20  	switch {
    21  	case e.Name != "":
    22  		return fmt.Sprintf("Space '%s' not found.", e.Name)
    23  	case e.GUID != "":
    24  		return fmt.Sprintf("Space with GUID '%s' not found.", e.GUID)
    25  	default:
    26  		return fmt.Sprintf("Space '' not found.")
    27  	}
    28  }
    29  
    30  // MultipleSpacesFoundError represents the scenario when the cloud
    31  // controller returns multiple spaces when filtering by name. This is a
    32  // far out edge case and should not happen.
    33  type MultipleSpacesFoundError struct {
    34  	Name    string
    35  	OrgGUID string
    36  }
    37  
    38  func (e MultipleSpacesFoundError) Error() string {
    39  	return fmt.Sprintf("Multiple spaces found matching organization GUID '%s' and name '%s'", e.OrgGUID, e.Name)
    40  }
    41  
    42  func (actor Actor) DeleteSpaceByNameAndOrganizationName(spaceName string, orgName string) (Warnings, error) {
    43  	var allWarnings Warnings
    44  
    45  	org, warnings, err := actor.GetOrganizationByName(orgName)
    46  	allWarnings = append(allWarnings, warnings...)
    47  	if err != nil {
    48  		return allWarnings, err
    49  	}
    50  
    51  	space, warnings, err := actor.GetSpaceByOrganizationAndName(org.GUID, spaceName)
    52  	allWarnings = append(allWarnings, warnings...)
    53  	if err != nil {
    54  		return allWarnings, err
    55  	}
    56  
    57  	job, deleteWarnings, err := actor.CloudControllerClient.DeleteSpace(space.GUID)
    58  	allWarnings = append(allWarnings, Warnings(deleteWarnings)...)
    59  	if err != nil {
    60  		return allWarnings, err
    61  	}
    62  
    63  	warnings, err = actor.PollJob(Job(job))
    64  	allWarnings = append(allWarnings, Warnings(warnings)...)
    65  
    66  	return allWarnings, err
    67  }
    68  
    69  // GetOrganizationSpaces returns a list of spaces in the specified org
    70  func (actor Actor) GetOrganizationSpaces(orgGUID string) ([]Space, Warnings, error) {
    71  	ccv2Spaces, warnings, err := actor.CloudControllerClient.GetSpaces(ccv2.Query{
    72  		Filter:   ccv2.OrganizationGUIDFilter,
    73  		Operator: ccv2.EqualOperator,
    74  		Values:   []string{orgGUID},
    75  	})
    76  	if err != nil {
    77  		return []Space{}, Warnings(warnings), err
    78  	}
    79  
    80  	spaces := make([]Space, len(ccv2Spaces))
    81  	for i, ccv2Space := range ccv2Spaces {
    82  		spaces[i] = Space(ccv2Space)
    83  	}
    84  
    85  	return spaces, Warnings(warnings), nil
    86  }
    87  
    88  // GetSpaceByOrganizationAndName returns an Space based on the org and name.
    89  func (actor Actor) GetSpaceByOrganizationAndName(orgGUID string, spaceName string) (Space, Warnings, error) {
    90  	ccv2Spaces, warnings, err := actor.CloudControllerClient.GetSpaces(
    91  		ccv2.Query{
    92  			Filter:   ccv2.NameFilter,
    93  			Operator: ccv2.EqualOperator,
    94  			Values:   []string{spaceName},
    95  		},
    96  		ccv2.Query{
    97  			Filter:   ccv2.OrganizationGUIDFilter,
    98  			Operator: ccv2.EqualOperator,
    99  			Values:   []string{orgGUID},
   100  		},
   101  	)
   102  	if err != nil {
   103  		return Space{}, Warnings(warnings), err
   104  	}
   105  
   106  	if len(ccv2Spaces) == 0 {
   107  		return Space{}, Warnings(warnings), SpaceNotFoundError{Name: spaceName}
   108  	}
   109  
   110  	if len(ccv2Spaces) > 1 {
   111  		return Space{}, Warnings(warnings), MultipleSpacesFoundError{OrgGUID: orgGUID, Name: spaceName}
   112  	}
   113  
   114  	return Space(ccv2Spaces[0]), Warnings(warnings), nil
   115  }