Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
206 changes: 206 additions & 0 deletions codefresh/cfclient/gitops_environments.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,206 @@
package cfclient

import (
"fmt"
)

const (
environmentQueryFields = `
id
name
kind
clusters {
runtimeName
name
server
namespaces
}
labelPairs
`
)

// GitopsEnvironment represents a GitOps environment configuration.
type GitopsEnvironment struct {
ID string `json:"id,omitempty"`
Name string `json:"name"`
Kind string `json:"kind"`
Clusters []GitopsEnvironmentCluster `json:"clusters"`
LabelPairs []string `json:"labelPairs"`
}

// GitopsCluster represents a cluster within a GitOps environment.
type GitopsEnvironmentCluster struct {
Name string `json:"name"`
RuntimeName string `json:"runtimeName"`
Namespaces []string `json:"namespaces"`
}

type GitopsEnvironmentResponse struct {
Errors []GraphQLError `json:"errors,omitempty"`
Data struct {
Environment GitopsEnvironment `json:"environment,omitempty"`
CreateEnvironment GitopsEnvironment `json:"createEnvironment,omitempty"`
UpdateEnvironment GitopsEnvironment `json:"updateEnvironment,omitempty"`
DeleteEnvironment GitopsEnvironment `json:"deleteEnvironment,omitempty"`
} `json:"data"`
}

type GitopsEnvironmentsResponse struct {
Data struct {
Environments []GitopsEnvironment `json:"environments,omitempty"`
} `json:"data"`
}

// At the time of writing Codefresh Graphql API does not support fetching environment by ID, So all environemnts are fetched and filtered within this client
func (client *Client) GetGitopsEnvironments() (*[]GitopsEnvironment, error) {

request := GraphQLRequest{
Query: fmt.Sprintf(`
query ($filters: EnvironmentFilterArgs) {
environments(filters: $filters) {
%s
}
}
`, environmentQueryFields),
Variables: map[string]interface{}{},
}

response, err := client.SendGqlRequest(request)

if err != nil {
return nil, err
}

var gitopsEnvironmentsResponse GitopsEnvironmentsResponse
err = DecodeGraphQLResponseInto(response, &gitopsEnvironmentsResponse)

if err != nil {
return nil, err
}

return &gitopsEnvironmentsResponse.Data.Environments, nil
}

func (client *Client) GetGitopsEnvironmentById(id string) (*GitopsEnvironment, error) {
environments, err := client.GetGitopsEnvironments()

if err != nil {
return nil, err
}

for _, env := range *environments {
if env.ID == id {
return &env, nil
}
}

return nil, nil
}

func (client *Client) CreateGitopsEnvironment(environment *GitopsEnvironment) (*GitopsEnvironment, error) {
request := GraphQLRequest{
Query: fmt.Sprintf(`
mutation ($environment: CreateEnvironmentArgs!) {
createEnvironment(environment: $environment) {
%s
}
}
`, environmentQueryFields),
Variables: map[string]interface{}{
"environment": environment,
},
}

response, err := client.SendGqlRequest(request)

if err != nil {
return nil, err
}

var gitopsEnvironmentResponse GitopsEnvironmentResponse
err = DecodeGraphQLResponseInto(response, &gitopsEnvironmentResponse)

if err != nil {
return nil, err
}

if len(gitopsEnvironmentResponse.Errors) > 0 {
return nil, fmt.Errorf("CreateGitopsEnvironment - %s", gitopsEnvironmentResponse.Errors)
}

return &gitopsEnvironmentResponse.Data.CreateEnvironment, nil
}

func (client *Client) DeleteGitopsEnvironment(id string) (*GitopsEnvironment, error) {

type deleteEnvironmentArgs struct {
ID string `json:"id"`
}

request := GraphQLRequest{
Query: fmt.Sprintf(`
mutation ($environment: DeleteEnvironmentArgs!) {
deleteEnvironment(environment: $environment) {
%s
}
}
`, environmentQueryFields),

Variables: map[string]interface{}{
"environment": deleteEnvironmentArgs{
ID: id,
},
},
}

response, err := client.SendGqlRequest(request)

if err != nil {
return nil, err
}
var gitopsEnvironmentResponse GitopsEnvironmentResponse
err = DecodeGraphQLResponseInto(response, &gitopsEnvironmentResponse)

if err != nil {
return nil, err
}

if len(gitopsEnvironmentResponse.Errors) > 0 {
return nil, fmt.Errorf("DeleteGitopsEnvironment - %s", gitopsEnvironmentResponse.Errors)
}

return &gitopsEnvironmentResponse.Data.DeleteEnvironment, nil
}

func (client *Client) UpdateGitopsEnvironment(environment *GitopsEnvironment) (*GitopsEnvironment, error) {
request := GraphQLRequest{
Query: fmt.Sprintf(`
mutation ($environment: UpdateEnvironmentArgs!) {
updateEnvironment(environment: $environment) {
%s
}
}
`, environmentQueryFields),
Variables: map[string]interface{}{
"environment": environment,
},
}

response, err := client.SendGqlRequest(request)

if err != nil {
return nil, err
}
var gitopsEnvironmentResponse GitopsEnvironmentResponse
err = DecodeGraphQLResponseInto(response, &gitopsEnvironmentResponse)

if err != nil {
return nil, err
}

if len(gitopsEnvironmentResponse.Errors) > 0 {
return nil, fmt.Errorf("UpdateGitopsEnvironment - %s", gitopsEnvironmentResponse.Errors)
}

return &gitopsEnvironmentResponse.Data.UpdateEnvironment, nil
}
5 changes: 5 additions & 0 deletions codefresh/cfclient/gql_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@ type GraphQLRequest struct {
Variables map[string]interface{} `json:"variables,omitempty"`
}

type GraphQLError struct {
Message string `json:"message,omitempty"`
Extensions string `json:"extensions,omitempty"`
}

func (client *Client) SendGqlRequest(request GraphQLRequest) ([]byte, error) {
jsonRequest, err := json.Marshal(request)
if err != nil {
Expand Down
1 change: 1 addition & 0 deletions codefresh/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ func Provider() *schema.Provider {
"codefresh_account_idp": resourceAccountIdp(),
"codefresh_account_gitops_settings": resourceAccountGitopsSettings(),
"codefresh_service_account": resourceServiceAccount(),
"codefresh_gitops_environment": resourceGitopsEnvironment(),
},
ConfigureFunc: configureProvider,
}
Expand Down
Loading
Loading