github.com/IBM-Cloud/bluemix-go@v0.0.0-20240423071914-9e96525baef4/api/resource/resourcev2/managementv2/resource_group.go (about)

     1  package managementv2
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/IBM-Cloud/bluemix-go/bmxerror"
     7  	"github.com/IBM-Cloud/bluemix-go/client"
     8  	"github.com/IBM-Cloud/bluemix-go/models"
     9  	"github.com/IBM-Cloud/bluemix-go/rest"
    10  )
    11  
    12  type ResourceOrigin string
    13  
    14  func (o ResourceOrigin) String() string {
    15  	return string(o)
    16  }
    17  
    18  //ResourceGroupUpdateRequest ...
    19  type ResourceGroupUpdateRequest struct {
    20  	Name    string `json:"name,omitempty"`
    21  	QuotaID string `json:"quota_id,omitempty"`
    22  	Default *bool  `json:"default,omitempty"`
    23  }
    24  
    25  // ResourceGroupQuery is the query filters to get resource groups
    26  type ResourceGroupQuery struct {
    27  	AccountID      string
    28  	Default        bool
    29  	ResourceID     string
    30  	ResourceOrigin models.ResourceOrigin
    31  }
    32  
    33  //ErrCodeResourceGroupDoesnotExist ...
    34  const ErrCodeResourceGroupDoesnotExist = "ResourceGroupDoesnotExist"
    35  
    36  //ResourceGroupQuery ...
    37  type ResourceGroupRepository interface {
    38  	// List all available resource groups
    39  	List(*ResourceGroupQuery) ([]models.ResourceGroupv2, error)
    40  	// Get resource group by ID
    41  	Get(id string) (*models.ResourceGroupv2, error)
    42  	// Find resource groups having the specific name
    43  	FindByName(*ResourceGroupQuery, string) ([]models.ResourceGroupv2, error)
    44  	// Create a new resource group
    45  	Create(models.ResourceGroupv2) (*models.ResourceGroupv2, error)
    46  	// Delete an existing resource group
    47  	Delete(id string) error
    48  	// Update an existing resource group
    49  	Update(id string, request *ResourceGroupUpdateRequest) (*models.ResourceGroupv2, error)
    50  }
    51  
    52  type resourceGroup struct {
    53  	client *client.Client
    54  }
    55  
    56  func newResourceGroupAPI(c *client.Client) ResourceGroupRepository {
    57  	return &resourceGroup{
    58  		client: c,
    59  	}
    60  }
    61  
    62  // populate query part of HTTP requests
    63  func (q ResourceGroupQuery) MakeRequest(r *rest.Request) *rest.Request {
    64  	if q.AccountID != "" {
    65  		r.Query("account_id", q.AccountID)
    66  	}
    67  	if q.Default {
    68  		r.Query("default", "true")
    69  	}
    70  	if q.ResourceID != "" {
    71  		r.Query("resource_id", q.ResourceID)
    72  	}
    73  	if q.ResourceOrigin != "" {
    74  		r.Query("resource_origin", q.ResourceOrigin.String())
    75  	}
    76  	return r
    77  }
    78  
    79  func (r *resourceGroup) List(query *ResourceGroupQuery) ([]models.ResourceGroupv2, error) {
    80  	listRequest := rest.GetRequest("/v2/resource_groups")
    81  	if query != nil {
    82  		query.MakeRequest(listRequest)
    83  	}
    84  	req, err := listRequest.Build()
    85  	if err != nil {
    86  		return []models.ResourceGroupv2{}, err
    87  	}
    88  
    89  	var groups []models.ResourceGroupv2
    90  	_, err = r.client.GetPaginated(
    91  		req.URL.String(),
    92  		NewRCPaginatedResources(models.ResourceGroupv2{}),
    93  		func(resource interface{}) bool {
    94  			if group, ok := resource.(models.ResourceGroupv2); ok {
    95  				groups = append(groups, group)
    96  				return true
    97  			}
    98  			return false
    99  		},
   100  	)
   101  
   102  	if err != nil {
   103  		return []models.ResourceGroupv2{}, err
   104  	}
   105  
   106  	return groups, nil
   107  }
   108  
   109  func (r *resourceGroup) FindByName(query *ResourceGroupQuery, name string) ([]models.ResourceGroupv2, error) {
   110  	groups, err := r.List(query)
   111  	if err != nil {
   112  		return []models.ResourceGroupv2{}, err
   113  	}
   114  
   115  	filteredGroups := []models.ResourceGroupv2{}
   116  	for _, group := range groups {
   117  		if group.Name == name {
   118  			filteredGroups = append(filteredGroups, group)
   119  		}
   120  	}
   121  
   122  	if len(filteredGroups) == 0 {
   123  		return filteredGroups, bmxerror.New(ErrCodeResourceGroupDoesnotExist,
   124  			fmt.Sprintf("Given resource Group : %q doesn't exist", name))
   125  
   126  	}
   127  	return filteredGroups, nil
   128  }
   129  
   130  func (r *resourceGroup) Create(group models.ResourceGroupv2) (*models.ResourceGroupv2, error) {
   131  	newGroup := models.ResourceGroupv2{}
   132  	_, err := r.client.Post("/v2/resource_groups", &group, &newGroup)
   133  	if err != nil {
   134  		return nil, err
   135  	}
   136  	return &newGroup, nil
   137  }
   138  
   139  func (r *resourceGroup) Delete(id string) error {
   140  	_, err := r.client.Delete("/v2/resource_groups/" + id)
   141  	return err
   142  }
   143  
   144  func (r *resourceGroup) Update(id string, request *ResourceGroupUpdateRequest) (*models.ResourceGroupv2, error) {
   145  	updatedGroup := models.ResourceGroupv2{}
   146  	_, err := r.client.Patch("/v2/resource_groups/"+id, request, &updatedGroup)
   147  	if err != nil {
   148  		return nil, err
   149  	}
   150  	return &updatedGroup, nil
   151  }
   152  
   153  func (r *resourceGroup) Get(id string) (*models.ResourceGroupv2, error) {
   154  	group := models.ResourceGroupv2{}
   155  	_, err := r.client.Get("/v2/resource_groups/"+id, &group)
   156  	if err != nil {
   157  		return nil, err
   158  	}
   159  	return &group, nil
   160  }