Skip to content

Commit 066de66

Browse files
author
Shreyas Sreenivas
committed
Reduce code duplication in each resource implementation
1 parent e4dbea9 commit 066de66

File tree

9 files changed

+226
-445
lines changed

9 files changed

+226
-445
lines changed

internal/client/cluster/cluster_resource.go

+19-106
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,23 @@ SPDX-License-Identifier: MPL-2.0
66
package clusterclient
77

88
import (
9-
"bytes"
109
"fmt"
11-
"io/ioutil"
12-
"net/http"
1310
"net/url"
1411

15-
"github.com/pkg/errors"
16-
17-
clienterrors "gitlab.eng.vmware.com/olympus/terraform-provider-tanzu/internal/client/errors"
1812
"gitlab.eng.vmware.com/olympus/terraform-provider-tanzu/internal/client/transport"
19-
"gitlab.eng.vmware.com/olympus/terraform-provider-tanzu/internal/helper"
2013
clustermodel "gitlab.eng.vmware.com/olympus/terraform-provider-tanzu/internal/models/cluster"
2114
)
2215

2316
// New creates a new cluster resource service API client.
24-
func New(transport *transport.Client, config *transport.Config) ClientService {
25-
return &Client{transport: transport, config: config}
17+
func New(transport *transport.Client) ClientService {
18+
return &Client{Client: transport}
2619
}
2720

2821
/*
2922
Client for cluster resource service API.
3023
*/
3124
type Client struct {
32-
transport *transport.Client
33-
config *transport.Config
25+
*transport.Client
3426
}
3527

3628
// ClientService is the interface for Client methods.
@@ -47,73 +39,28 @@ type ClientService interface {
4739
/*
4840
ManageV1alpha1ClusterResourceServiceCreate creates a cluster.
4941
*/
50-
func (a *Client) ManageV1alpha1ClusterResourceServiceCreate(request *clustermodel.VmwareTanzuManageV1alpha1ClusterRequest) (*clustermodel.VmwareTanzuManageV1alpha1ClusterResponse, error) {
51-
requestURL := fmt.Sprintf("%s%s", a.config.Host, "/v1alpha1/clusters")
42+
func (c *Client) ManageV1alpha1ClusterResourceServiceCreate(request *clustermodel.VmwareTanzuManageV1alpha1ClusterRequest) (*clustermodel.VmwareTanzuManageV1alpha1ClusterResponse, error) {
43+
response := &clustermodel.VmwareTanzuManageV1alpha1ClusterResponse{}
44+
err := c.Create("v1alpha1/clusters", request, response)
5245

53-
return a.invokeAction(http.MethodPost, requestURL, request)
46+
return response, err
5447
}
5548

5649
/*
5750
ManageV1alpha1ClusterResourceServiceUpdate updates a cluster.
5851
*/
59-
func (a *Client) ManageV1alpha1ClusterResourceServiceUpdate(request *clustermodel.VmwareTanzuManageV1alpha1ClusterRequest) (*clustermodel.VmwareTanzuManageV1alpha1ClusterResponse, error) {
60-
requestURL := fmt.Sprintf("%s%s%s", a.config.Host, "/v1alpha1/clusters/", request.Cluster.FullName.Name)
61-
62-
return a.invokeAction(http.MethodPut, requestURL, request)
63-
}
64-
65-
func (a *Client) invokeAction(httpMethodType string, requestURL string, request *clustermodel.VmwareTanzuManageV1alpha1ClusterRequest) (*clustermodel.VmwareTanzuManageV1alpha1ClusterResponse, error) {
66-
body, err := request.MarshalBinary()
67-
if err != nil {
68-
return nil, errors.Wrap(err, "marshall request body")
69-
}
70-
71-
headers := a.config.Headers
72-
headers.Set(helper.ContentLengthKey, fmt.Sprintf("%d", len(body)))
73-
74-
var resp *http.Response
75-
76-
// nolint:bodyclose // response is being closed outside the switch block
77-
switch httpMethodType {
78-
case http.MethodPost:
79-
resp, err = a.transport.Post(requestURL, bytes.NewReader(body), headers)
80-
if err != nil {
81-
return nil, errors.Wrap(err, "create")
82-
}
83-
case http.MethodPut:
84-
resp, err = a.transport.Put(requestURL, bytes.NewReader(body), headers)
85-
if err != nil {
86-
return nil, errors.Wrap(err, "update")
87-
}
88-
default:
89-
return nil, errors.New("unsupported http method type invoked")
90-
}
91-
92-
defer resp.Body.Close()
52+
func (c *Client) ManageV1alpha1ClusterResourceServiceUpdate(request *clustermodel.VmwareTanzuManageV1alpha1ClusterRequest) (*clustermodel.VmwareTanzuManageV1alpha1ClusterResponse, error) {
53+
response := &clustermodel.VmwareTanzuManageV1alpha1ClusterResponse{}
54+
requestURL := fmt.Sprintf("%s/%s", "v1alpha1/clusters", request.Cluster.FullName.Name)
55+
err := c.Update(requestURL, request, response)
9356

94-
respBody, err := ioutil.ReadAll(resp.Body)
95-
if err != nil {
96-
return nil, errors.Wrapf(err, "read %v response", httpMethodType)
97-
}
98-
99-
if resp.StatusCode != http.StatusOK {
100-
return nil, errors.Errorf("%s tanzu TMC cluster request failed with status : %v, response: %v", httpMethodType, resp.Status, string(respBody))
101-
}
102-
103-
clusterResponse := &clustermodel.VmwareTanzuManageV1alpha1ClusterResponse{}
104-
105-
err = clusterResponse.UnmarshalBinary(respBody)
106-
if err != nil {
107-
return nil, errors.Wrap(err, "unmarshall")
108-
}
109-
110-
return clusterResponse, nil
57+
return response, err
11158
}
11259

11360
/*
11461
ManageV1alpha1ClusterResourceServiceDelete deletes a cluster.
11562
*/
116-
func (a *Client) ManageV1alpha1ClusterResourceServiceDelete(fn *clustermodel.VmwareTanzuManageV1alpha1ClusterFullName, force string) error {
63+
func (c *Client) ManageV1alpha1ClusterResourceServiceDelete(fn *clustermodel.VmwareTanzuManageV1alpha1ClusterFullName, force string) error {
11764
queryParams := url.Values{
11865
"force": []string{force},
11966
}
@@ -126,28 +73,15 @@ func (a *Client) ManageV1alpha1ClusterResourceServiceDelete(fn *clustermodel.Vmw
12673
queryParams["fullName.provisionerName"] = []string{fn.ProvisionerName}
12774
}
12875

129-
requestURL := fmt.Sprintf("%s%s%s?%s", a.config.Host, "/v1alpha1/clusters/", fn.Name, queryParams.Encode())
76+
requestURL := fmt.Sprintf("%s/%s?%s", "v1alpha1/clusters", fn.Name, queryParams.Encode())
13077

131-
resp, err := a.transport.Delete(requestURL, a.config.Headers)
132-
if err != nil {
133-
return errors.Wrap(err, "delete")
134-
}
135-
136-
defer resp.Body.Close()
137-
138-
respBody, _ := ioutil.ReadAll(resp.Body)
139-
140-
if resp.StatusCode != http.StatusOK {
141-
return clienterrors.ErrorWithHTTPCode(resp.StatusCode, errors.Errorf("delete tanzu TMC cluster request failed with status : %v, response: %v", resp.Status, string(respBody)))
142-
}
143-
144-
return nil
78+
return c.Delete(requestURL)
14579
}
14680

14781
/*
14882
ManageV1alpha1ClusterResourceServiceGet gets a cluster.
14983
*/
150-
func (a *Client) ManageV1alpha1ClusterResourceServiceGet(fn *clustermodel.VmwareTanzuManageV1alpha1ClusterFullName) (*clustermodel.VmwareTanzuManageV1alpha1ClusterGetClusterResponse, error) {
84+
func (c *Client) ManageV1alpha1ClusterResourceServiceGet(fn *clustermodel.VmwareTanzuManageV1alpha1ClusterFullName) (*clustermodel.VmwareTanzuManageV1alpha1ClusterGetClusterResponse, error) {
15185
queryParams := url.Values{}
15286

15387
if fn.ManagementClusterName != "" {
@@ -158,30 +92,9 @@ func (a *Client) ManageV1alpha1ClusterResourceServiceGet(fn *clustermodel.Vmware
15892
queryParams["fullName.provisionerName"] = []string{fn.ProvisionerName}
15993
}
16094

161-
requestURL := fmt.Sprintf("%s%s%s?%s", a.config.Host, "/v1alpha1/clusters/", fn.Name, queryParams.Encode())
162-
163-
resp, err := a.transport.Get(requestURL, a.config.Headers)
164-
if err != nil {
165-
return nil, errors.Wrap(err, "get request")
166-
}
167-
168-
defer resp.Body.Close()
169-
170-
respBody, err := ioutil.ReadAll(resp.Body)
171-
if err != nil {
172-
return nil, errors.Wrap(err, "read response")
173-
}
174-
175-
if resp.StatusCode != http.StatusOK {
176-
return nil, clienterrors.ErrorWithHTTPCode(resp.StatusCode, errors.Errorf("get tanzu TMC cluster request failed with status : %v, response: %v", resp.Status, string(respBody)))
177-
}
178-
95+
requestURL := fmt.Sprintf("%s/%s?%s", "v1alpha1/clusters", fn.Name, queryParams.Encode())
17996
clusterResponse := &clustermodel.VmwareTanzuManageV1alpha1ClusterGetClusterResponse{}
97+
err := c.Get(requestURL, clusterResponse)
18098

181-
err = clusterResponse.UnmarshalBinary(respBody)
182-
if err != nil {
183-
return nil, errors.Wrap(err, "unmarshall")
184-
}
185-
186-
return clusterResponse, nil
99+
return clusterResponse, err
187100
}

internal/client/clustergroup/cluster_group_resource.go

+18-107
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,22 @@ SPDX-License-Identifier: MPL-2.0
66
package clustergroupclient
77

88
import (
9-
"bytes"
109
"fmt"
11-
"io/ioutil"
12-
"net/http"
1310

14-
"github.com/pkg/errors"
15-
16-
clienterrors "gitlab.eng.vmware.com/olympus/terraform-provider-tanzu/internal/client/errors"
1711
"gitlab.eng.vmware.com/olympus/terraform-provider-tanzu/internal/client/transport"
18-
"gitlab.eng.vmware.com/olympus/terraform-provider-tanzu/internal/helper"
1912
clustergroupmodel "gitlab.eng.vmware.com/olympus/terraform-provider-tanzu/internal/models/clustergroup"
2013
)
2114

2215
// New creates a new cluster group resource service API client.
23-
func New(transport *transport.Client, config *transport.Config) ClientService {
24-
return &Client{transport: transport, config: config}
16+
func New(transport *transport.Client) ClientService {
17+
return &Client{Client: transport}
2518
}
2619

2720
/*
2821
Client for cluster group resource service API
2922
*/
3023
type Client struct {
31-
transport *transport.Client
32-
config *transport.Config
24+
*transport.Client
3325
}
3426

3527
// ClientService is the interface for Client methods.
@@ -46,122 +38,41 @@ type ClientService interface {
4638
/*
4739
ManageV1alpha1ClusterGroupResourceServiceGet gets a cluster group
4840
*/
49-
func (a *Client) ManageV1alpha1ClusterGroupResourceServiceGet(fn *clustergroupmodel.VmwareTanzuManageV1alpha1ClustergroupFullName) (*clustergroupmodel.VmwareTanzuManageV1alpha1ClustergroupGetClusterGroupResponse, error) {
50-
requestURL := fmt.Sprintf("%s%s%s", a.config.Host, "/v1alpha1/clustergroups/", fn.Name)
51-
52-
resp, err := a.transport.Get(requestURL, a.config.Headers)
53-
if err != nil {
54-
return nil, errors.Wrap(err, "read")
55-
}
56-
57-
defer resp.Body.Close()
58-
59-
respBody, err := ioutil.ReadAll(resp.Body)
60-
if err != nil {
61-
return nil, errors.Wrap(err, "read response body")
62-
}
63-
64-
if resp.StatusCode != http.StatusOK {
65-
return nil, errors.Errorf("get tanzu TMC cluster group request failed with status : %v, response : %v", resp.Status, string(respBody))
66-
}
67-
41+
func (c *Client) ManageV1alpha1ClusterGroupResourceServiceGet(fn *clustergroupmodel.VmwareTanzuManageV1alpha1ClustergroupFullName) (*clustergroupmodel.VmwareTanzuManageV1alpha1ClustergroupGetClusterGroupResponse, error) {
42+
requestURL := fmt.Sprintf("%s/%s", "v1alpha1/clustergroups", fn.Name)
6843
clusterGroupResponse := &clustergroupmodel.VmwareTanzuManageV1alpha1ClustergroupGetClusterGroupResponse{}
6944

70-
err = clusterGroupResponse.UnmarshalBinary(respBody)
71-
if err != nil {
72-
return nil, errors.Wrap(err, "unmarshall")
73-
}
45+
err := c.Get(requestURL, clusterGroupResponse)
7446

75-
return clusterGroupResponse, nil
47+
return clusterGroupResponse, err
7648
}
7749

7850
/*
7951
ManageV1alpha1ClusterGroupResourceServiceDelete deletes a cluster group
8052
*/
81-
func (a *Client) ManageV1alpha1ClusterGroupResourceServiceDelete(fn *clustergroupmodel.VmwareTanzuManageV1alpha1ClustergroupFullName) error {
82-
requestURL := fmt.Sprintf("%s%s%s", a.config.Host, "/v1alpha1/clustergroups/", fn.Name)
83-
84-
resp, err := a.transport.Delete(requestURL, a.config.Headers)
85-
if err != nil {
86-
return errors.Wrap(err, "delete")
87-
}
88-
89-
respBody, err := ioutil.ReadAll(resp.Body)
90-
if err != nil {
91-
return errors.Wrap(err, "read delete response")
92-
}
53+
func (c *Client) ManageV1alpha1ClusterGroupResourceServiceDelete(fn *clustergroupmodel.VmwareTanzuManageV1alpha1ClustergroupFullName) error {
54+
requestURL := fmt.Sprintf("%s/%s", "v1alpha1/clustergroups", fn.Name)
9355

94-
defer resp.Body.Close()
95-
96-
if resp.StatusCode != http.StatusOK {
97-
return clienterrors.ErrorWithHTTPCode(resp.StatusCode, errors.Errorf("delete tanzu TMC cluster group request failed with status : %v, response : %v", resp.Status, string(respBody)))
98-
}
99-
100-
return nil
56+
return c.Delete(requestURL)
10157
}
10258

10359
/*
10460
ManageV1alpha1ClusterGroupResourceServiceCreate creates a cluster group
10561
*/
106-
func (a *Client) ManageV1alpha1ClusterGroupResourceServiceCreate(request *clustergroupmodel.VmwareTanzuManageV1alpha1ClusterGroupRequest) (*clustergroupmodel.VmwareTanzuManageV1alpha1ClusterGroupResponse, error) {
107-
requestURL := fmt.Sprintf("%s%s", a.config.Host, "/v1alpha1/clustergroups")
62+
func (c *Client) ManageV1alpha1ClusterGroupResourceServiceCreate(request *clustergroupmodel.VmwareTanzuManageV1alpha1ClusterGroupRequest) (*clustergroupmodel.VmwareTanzuManageV1alpha1ClusterGroupResponse, error) {
63+
clusterGroupResponse := &clustergroupmodel.VmwareTanzuManageV1alpha1ClusterGroupResponse{}
64+
err := c.Create("v1alpha1/clustergroups", request, clusterGroupResponse)
10865

109-
return a.invokeAction(http.MethodPost, requestURL, request)
66+
return clusterGroupResponse, err
11067
}
11168

11269
/*
11370
ManageV1alpha1ClusterGroupResourceServiceUpdate updates a cluster group
11471
*/
115-
func (a *Client) ManageV1alpha1ClusterGroupResourceServiceUpdate(request *clustergroupmodel.VmwareTanzuManageV1alpha1ClusterGroupRequest) (*clustergroupmodel.VmwareTanzuManageV1alpha1ClusterGroupResponse, error) {
116-
requestURL := fmt.Sprintf("%s%s%s", a.config.Host, "/v1alpha1/clustergroups/", request.ClusterGroup.FullName.Name)
117-
118-
return a.invokeAction(http.MethodPut, requestURL, request)
119-
}
120-
121-
func (a *Client) invokeAction(httpMethodType string, requestURL string, request *clustergroupmodel.VmwareTanzuManageV1alpha1ClusterGroupRequest) (*clustergroupmodel.VmwareTanzuManageV1alpha1ClusterGroupResponse, error) {
122-
body, err := request.MarshalBinary()
123-
if err != nil {
124-
return nil, errors.Wrap(err, "marshall request body")
125-
}
126-
127-
headers := a.config.Headers
128-
headers.Set(helper.ContentLengthKey, fmt.Sprintf("%d", len(body)))
129-
130-
var resp *http.Response
131-
132-
// nolint:bodyclose // response is being closed outside the switch block
133-
switch httpMethodType {
134-
case http.MethodPost:
135-
resp, err = a.transport.Post(requestURL, bytes.NewReader(body), headers)
136-
if err != nil {
137-
return nil, errors.Wrap(err, "create")
138-
}
139-
case http.MethodPut:
140-
resp, err = a.transport.Put(requestURL, bytes.NewReader(body), headers)
141-
if err != nil {
142-
return nil, errors.Wrap(err, "update")
143-
}
144-
default:
145-
return nil, errors.New("unsupported http method type invoked")
146-
}
147-
148-
defer resp.Body.Close()
149-
150-
respBody, err := ioutil.ReadAll(resp.Body)
151-
if err != nil {
152-
return nil, errors.Wrapf(err, "read %v response", httpMethodType)
153-
}
154-
155-
if resp.StatusCode != http.StatusOK {
156-
return nil, errors.Errorf("%s tanzu TMC cluster group request failed with status : %v, response: %v", httpMethodType, resp.Status, string(respBody))
157-
}
158-
72+
func (c *Client) ManageV1alpha1ClusterGroupResourceServiceUpdate(request *clustergroupmodel.VmwareTanzuManageV1alpha1ClusterGroupRequest) (*clustergroupmodel.VmwareTanzuManageV1alpha1ClusterGroupResponse, error) {
73+
requestURL := fmt.Sprintf("%s/%s", "v1alpha1/clustergroups", request.ClusterGroup.FullName.Name)
15974
clusterGroupResponse := &clustergroupmodel.VmwareTanzuManageV1alpha1ClusterGroupResponse{}
75+
err := c.Update(requestURL, request, clusterGroupResponse)
16076

161-
err = clusterGroupResponse.UnmarshalBinary(respBody)
162-
if err != nil {
163-
return nil, errors.Wrap(err, "unmarshall")
164-
}
165-
166-
return clusterGroupResponse, nil
77+
return clusterGroupResponse, err
16778
}

internal/client/http_client.go

+7-9
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,20 @@ func NewHTTPClient() *TanzuMissionControl {
2424
headers.Set("Content-Type", "application/json")
2525
headers.Set("Connection", "keep-alive")
2626

27-
cfg := transport.DefaultTransportConfig().AddHeaders(headers)
27+
httpClient.AddHeaders(headers)
2828

2929
return &TanzuMissionControl{
30-
Config: cfg,
31-
Transport: httpClient,
32-
ClusterResourceService: clusterclient.New(httpClient, cfg),
33-
WorkspaceResourceService: workspaceclient.New(httpClient, cfg),
34-
NamespaceResourceService: namespaceclient.New(httpClient, cfg),
35-
ClusterGroupResourceService: clustergroupclient.New(httpClient, cfg),
30+
Client: httpClient,
31+
ClusterResourceService: clusterclient.New(httpClient),
32+
WorkspaceResourceService: workspaceclient.New(httpClient),
33+
NamespaceResourceService: namespaceclient.New(httpClient),
34+
ClusterGroupResourceService: clustergroupclient.New(httpClient),
3635
}
3736
}
3837

3938
// TanzuMissionControl is a client for tanzu mission control.
4039
type TanzuMissionControl struct {
41-
*transport.Config
42-
Transport *transport.Client
40+
*transport.Client
4341
ClusterResourceService clusterclient.ClientService
4442
WorkspaceResourceService workspaceclient.ClientService
4543
NamespaceResourceService namespaceclient.ClientService

0 commit comments

Comments
 (0)