Skip to content

Commit

Permalink
feat(cloud-provisioning): Adds functions to cloudproviders web client
Browse files Browse the repository at this point in the history
Closes VC-33251
  • Loading branch information
rvelaVenafi committed May 11, 2024
1 parent bb54865 commit 9aad422
Show file tree
Hide file tree
Showing 5 changed files with 104 additions and 10 deletions.
43 changes: 43 additions & 0 deletions internal/datasource/webclient/cloudproviders/cloudproviders.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,46 @@
package cloudproviders

import (
"context"
"fmt"
"net/http"

"github.com/Khan/genqlient/graphql"
"github.com/google/uuid"
)

//go:generate go run -mod=mod github.com/Khan/genqlient genqlient.yaml

type CloudProvidersClient struct {
graphqlClient graphql.Client
}

func NewCloudProvidersClient(url string, httpClient *http.Client) *CloudProvidersClient {
return &CloudProvidersClient{
graphqlClient: graphql.NewClient(url, httpClient),
}
}

func (c *CloudProvidersClient) GetCloudProviderByName(ctx context.Context, name string) (*CloudProvider, error) {
if name == "" {
return nil, fmt.Errorf("cloud provider name cannot be empty")
}
resp, err := GetCloudProviderByName(ctx, c.graphqlClient, name)
if err != nil {
return nil, fmt.Errorf("failed to retrieve Cloud Provider with name %s: %w", name, err)
}
if resp == nil || resp.GetCloudProviders() == nil || len(resp.GetCloudProviders().Nodes) != 1 {
return nil, fmt.Errorf("could not find Cloud Provider with name %s", name)
}

cp := resp.GetCloudProviders().Nodes[0]

return &CloudProvider{
ID: uuid.MustParse(cp.GetId()),
Name: cp.GetName(),
Type: string(cp.GetType()),
Status: string(cp.GetStatus()),
StatusDetails: *cp.GetStatusDetails(),
KeystoresCount: cp.GetKeystoresCount(),
}, nil
}
12 changes: 12 additions & 0 deletions internal/datasource/webclient/cloudproviders/models.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package cloudproviders

import "github.com/google/uuid"

type CloudProvider struct {
ID uuid.UUID
Name string
Type string
Status string
StatusDetails string
KeystoresCount int
}
3 changes: 3 additions & 0 deletions pkg/httputils/transportApi.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ type AuthedTransportApi struct {
ApiKey string
AccessToken string
Wrapped http.RoundTripper
UserAgent string
}

func (t *AuthedTransportApi) RoundTrip(req *http.Request) (*http.Response, error) {
Expand All @@ -21,5 +22,7 @@ func (t *AuthedTransportApi) RoundTrip(req *http.Request) (*http.Response, error
} else if t.ApiKey != "" {
req.Header.Set(util.HeaderTpplApikey, t.ApiKey)
}
req.Header.Set(headers.UserAgent, t.UserAgent)

return t.Wrapped.RoundTrip(req)
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package cloud

import (
"context"
"encoding/json"
"fmt"
"net/http"
"time"

"github.com/Khan/genqlient/graphql"
"github.com/Venafi/vcert/v5/pkg/util"

"github.com/Venafi/vcert/v5/internal/datasource/webclient/cloudproviders"
"github.com/Venafi/vcert/v5/pkg/endpoint"
Expand Down Expand Up @@ -182,6 +184,36 @@ func (c *Connector) getGraphqlClient() graphql.Client {
return client
}

func (c *Connector) getGraphqlHTTPClient() *http.Client {
// We provide every type of auth here.
// The logic to decide which auth is inside struct's function: RoundTrip
httpclient := &http.Client{
Transport: &httputils.AuthedTransportApi{
ApiKey: c.apiKey,
AccessToken: c.accessToken,
Wrapped: http.DefaultTransport,
UserAgent: util.DefaultUserAgent,
},
Timeout: 30 * time.Second,
}
return httpclient
}

func (c *Connector) GetCloudProviderByName(name string) (*cloudproviders.CloudProvider, error) {
if name == "" {
return nil, fmt.Errorf("cloud provider name cannot be empty")
}

cloudProvider, err := c.cloudProvidersClient.GetCloudProviderByName(context.Background(), name)
if err != nil {
return nil, fmt.Errorf("failed to retrieve Cloud Provider with name %s: %w", name, err)
}
if cloudProvider == nil {
return nil, fmt.Errorf("could not find Cloud Provider with name %s", name)
}
return cloudProvider, nil
}

func getCloudMetadataFromWebsocketResponse(respMap interface{}, keystoreType cloudproviders.CloudKeystoreType, keystoreId string) (*CloudProvisioningMetadata, error) {

val := CloudKeystoreProvisioningResult{}
Expand Down Expand Up @@ -210,7 +242,7 @@ func getCloudMetadataFromWebsocketResponse(respMap interface{}, keystoreType clo
case cloudproviders.CloudKeystoreTypeGcm:
cloudMetadata.gcpMetadata.result = val
default:
err = fmt.Errorf("Unknown ConnectorType %v found for keystore with ID: %s", keystoreType, keystoreId)
err = fmt.Errorf("unknown type %v for keystore with ID: %s", keystoreType, keystoreId)
return nil, err
}
return cloudMetadata, err
Expand Down
22 changes: 13 additions & 9 deletions pkg/venafi/cloud/connector.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,15 +88,16 @@ const (

// Connector contains the base data needed to communicate with the Venafi Cloud servers
type Connector struct {
baseURL string
apiKey string
accessToken string
verbose bool
user *userDetails
trust *x509.CertPool
zone cloudZone
client *http.Client
userAgent string
baseURL string
apiKey string
accessToken string
verbose bool
user *userDetails
trust *x509.CertPool
zone cloudZone
client *http.Client
userAgent string
cloudProvidersClient *cloudproviders.CloudProvidersClient
}

// NewConnector creates a new Venafi Cloud Connector object used to communicate with Venafi Cloud
Expand Down Expand Up @@ -168,6 +169,9 @@ func (c *Connector) Authenticate(auth *endpoint.Authentication) error {
return err
}
c.user = ud

c.cloudProvidersClient = cloudproviders.NewCloudProvidersClient(c.getURL(urlGraphql), c.getGraphqlHTTPClient())

return nil
}

Expand Down

0 comments on commit 9aad422

Please sign in to comment.