From 55ac561daa385d89cd7784758bb696ca26960243 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Goli=C5=84ski?= Date: Thu, 29 Feb 2024 13:43:40 +0100 Subject: [PATCH 01/13] Create Spacelift client --- client/client.go | 45 ++++++++++++++++++++++++++++++ client/client_test.go | 38 +++++++++++++++++++++++++ go.mod | 25 +++++++++++------ go.sum | 64 +++++++++++++++++++++++++++---------------- 4 files changed, 140 insertions(+), 32 deletions(-) create mode 100644 client/client.go create mode 100644 client/client_test.go diff --git a/client/client.go b/client/client.go new file mode 100644 index 0000000..ad679d5 --- /dev/null +++ b/client/client.go @@ -0,0 +1,45 @@ +package client + +import ( + "context" + "net/http" + + "github.com/shurcooL/graphql" + + spacectl "github.com/spacelift-io/spacectl/client" + "github.com/spacelift-io/spacectl/client/session" +) + +type client struct { + wraps spacectl.Client +} + +// New returns a new instance of a Spacelift Client. +func New(endpoint, keyID, keySecret string) (*client, error) { + ctx, httpClient := session.Defaults() + + session, err := session.FromAPIKey(ctx, httpClient)(endpoint, keyID, keySecret) + if err != nil { + return nil, err + } + + spaceliftClient := spacectl.New(httpClient, session) + + return &client{wraps: spaceliftClient}, nil +} + +func (c *client) Mutate(ctx context.Context, mutation interface{}, variables map[string]interface{}, opts ...graphql.RequestOption) error { + return c.wraps.Mutate(ctx, mutation, variables, opts...) +} + +func (c *client) Query(ctx context.Context, query interface{}, variables map[string]interface{}, opts ...graphql.RequestOption) error { + return c.wraps.Query(ctx, query, variables, opts...) +} + +func (c *client) URL(format string, a ...interface{}) string { + return c.wraps.URL(format, a...) +} + +func (c *client) Do(req *http.Request) (*http.Response, error) { + return c.wraps.Do(req) +} diff --git a/client/client_test.go b/client/client_test.go new file mode 100644 index 0000000..1725297 --- /dev/null +++ b/client/client_test.go @@ -0,0 +1,38 @@ +package client_test + +import ( + "context" + "os" + "testing" + + "github.com/shurcooL/graphql" + "github.com/spacelift-io/spacelift-operator/client" + "github.com/stretchr/testify/assert" +) + +func TestClient(t *testing.T) { + // TODO(michal): Make this test more useful, this is just a simple test that checks if client is working + endpoint := os.Getenv("SPACELIFT_API_KEY_ENDPOINT") + keyID := os.Getenv("SPACELIFT_API_KEY_ID") + keySecret := os.Getenv("SPACELIFT_API_KEY_SECRET") + + spaceliftCli, err := client.New(endpoint, keyID, keySecret) + assert.Nil(t, err) + + var query struct { + Stack struct { + ID string `graphql:"id"` + Administrative bool `graphql:"administrative"` + } `graphql:"stack(id: $id)"` + } + + variables := map[string]interface{}{ + "id": graphql.ID("end-to-end-autoconfirm"), + } + + err = spaceliftCli.Query(context.Background(), &query, variables) + assert.Nil(t, err) + + assert.Equal(t, query.Stack.ID, "end-to-end-autoconfirm") + assert.True(t, query.Stack.Administrative) +} diff --git a/go.mod b/go.mod index e99ca66..1418c16 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,10 @@ toolchain go1.21.4 require ( github.com/fatih/color v1.16.0 github.com/nwidger/jsoncolor v0.3.2 + github.com/onsi/ginkgo/v2 v2.13.0 + github.com/onsi/gomega v1.30.0 + github.com/shurcooL/graphql v0.0.0-20230722043721-ed46e5a46466 + github.com/spacelift-io/spacectl v0.30.0 github.com/stretchr/testify v1.8.4 go.uber.org/zap v1.27.0 k8s.io/apimachinery v0.28.0 @@ -26,12 +30,15 @@ require ( github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect + github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect github.com/google/uuid v1.3.0 // indirect github.com/imdario/mergo v0.3.6 // indirect github.com/josharian/intern v1.0.0 // indirect @@ -52,16 +59,16 @@ require ( github.com/spf13/pflag v1.0.5 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.14.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/net v0.18.0 // indirect + golang.org/x/oauth2 v0.14.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/term v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect + golang.org/x/tools v0.12.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.30.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect @@ -75,3 +82,5 @@ require ( sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) + +replace github.com/shurcooL/graphql => github.com/spacelift-io/graphql v1.2.0 diff --git a/go.sum b/go.sum index 8449df3..3b86680 100644 --- a/go.sum +++ b/go.sum @@ -13,6 +13,9 @@ github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqy github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= @@ -32,6 +35,8 @@ github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/franela/goblin v0.0.0-20211003143422-0a4f594942bf h1:NrF81UtW8gG2LBGkXFQFqlfNnvMt9WdB46sfdJY4oqc= +github.com/franela/goblin v0.0.0-20211003143422-0a4f594942bf/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -51,6 +56,8 @@ github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEe github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -63,8 +70,8 @@ github.com/google/cel-go v0.16.0/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulN github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -77,6 +84,7 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -117,10 +125,10 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/nwidger/jsoncolor v0.3.2 h1:rVJJlwAWDJShnbTYOQ5RM7yTA20INyKXlJ/fg4JMhHQ= github.com/nwidger/jsoncolor v0.3.2/go.mod h1:Cs34umxLbJvgBMnVNVqhji9BhoT/N/KinHqZptQ7cf4= -github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= -github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= -github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= +github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -136,6 +144,10 @@ github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+Pymzi github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/spacelift-io/graphql v1.2.0 h1:oUS1fyO4cqMGOcydu26BVbZkTf/pdDnLWVal6lYv49Q= +github.com/spacelift-io/graphql v1.2.0/go.mod h1:Q/JMkvFWF8uXZQkDn8i9Nc3aXucbgTFeuFZ6WQMt0Wg= +github.com/spacelift-io/spacectl v0.30.0 h1:4EBAYJhdkRRGPYw2fFqYpym1+h6UWN1J6lfzCgmKFI4= +github.com/spacelift-io/spacectl v0.30.0/go.mod h1:5szy3PNY6X7NyfBsMs1EcFW66NricJq8L3AGoBQIHLc= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -146,6 +158,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= @@ -194,14 +207,16 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= @@ -209,21 +224,22 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= +golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= +golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -231,16 +247,16 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -249,8 +265,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= -golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss= +golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -269,8 +285,8 @@ google.golang.org/grpc v1.54.0 h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= From 69a27d6d0989a725f45d5b2b55d7b297a1a793e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Goli=C5=84ski?= Date: Fri, 1 Mar 2024 15:03:07 +0100 Subject: [PATCH 02/13] Create client based on secret --- client/client.go | 45 +++++++++++++++++++++++++ client/interface.go | 23 +++++++++++++ internal/controller/stack_controller.go | 27 ++++++++++++++- 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 client/interface.go diff --git a/client/client.go b/client/client.go index ad679d5..57b0dee 100644 --- a/client/client.go +++ b/client/client.go @@ -5,11 +5,56 @@ import ( "net/http" "github.com/shurcooL/graphql" + v1 "k8s.io/api/core/v1" + k8sclient "sigs.k8s.io/controller-runtime/pkg/client" spacectl "github.com/spacelift-io/spacectl/client" "github.com/spacelift-io/spacectl/client/session" ) +// SpaceliftClient is the authenticated client that can be used to interact with Spacelift +var SpaceliftClient Client + +const ( + // SecretName + SecretName = "spacelift-credentials" + SpaceliftApiKeyEndpointKey = "SPACELIFT_API_KEY_ENDPOINT" + SpaceliftApiKeyIDKey = "SPACELIFT_API_KEY_ID" + SpaceliftApiKeySecretKey = "SPACELIFT_API_KEY_SECRET" +) + +func GetSpaceliftClient(c k8sclient.Client, namespace string) (Client, error) { + if SpaceliftClient != nil { + return SpaceliftClient, nil + } + + var secret v1.Secret + + if err := c.Get( + context.Background(), + k8sclient.ObjectKey{ + Namespace: namespace, + Name: SecretName, + }, + &secret, + ); err != nil { + return nil, err + } + + endpoint := string(secret.Data[SpaceliftApiKeyEndpointKey]) + apiKeyID := string(secret.Data[SpaceliftApiKeyIDKey]) + apiKeySecret := string(secret.Data[SpaceliftApiKeySecretKey]) + + spaceliftClient, err := New(endpoint, apiKeyID, apiKeySecret) + if err != nil { + return nil, err + } + + SpaceliftClient = spaceliftClient + + return SpaceliftClient, nil +} + type client struct { wraps spacectl.Client } diff --git a/client/interface.go b/client/interface.go new file mode 100644 index 0000000..64e1d85 --- /dev/null +++ b/client/interface.go @@ -0,0 +1,23 @@ +package client + +import ( + "context" + "net/http" + + "github.com/shurcooL/graphql" +) + +// Client abstracts away Spacelift's client API. +type Client interface { + // Query executes a single GraphQL query request. + Query(context.Context, interface{}, map[string]interface{}, ...graphql.RequestOption) error + + // Mutate executes a single GraphQL mutation request. + Mutate(context.Context, interface{}, map[string]interface{}, ...graphql.RequestOption) error + + // URL returns a full URL given a formatted path. + URL(string, ...interface{}) string + + // Do executes an authenticated http request to the Spacelift API + Do(r *http.Request) (*http.Response, error) +} diff --git a/internal/controller/stack_controller.go b/internal/controller/stack_controller.go index d8cb67f..11c2e43 100644 --- a/internal/controller/stack_controller.go +++ b/internal/controller/stack_controller.go @@ -24,7 +24,9 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" + "github.com/shurcooL/graphql" appspaceliftiov1beta1 "github.com/spacelift-io/spacelift-operator/api/v1beta1" + spaceliftclient "github.com/spacelift-io/spacelift-operator/client" ) // StackReconciler reconciles a Stack object @@ -47,7 +49,30 @@ type StackReconciler struct { // For more details, check Reconcile and its Result here: // - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.17.0/pkg/reconcile func (r *StackReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - _ = log.FromContext(ctx) + logger := log.FromContext(ctx) + + spaceliftClient, err := spaceliftclient.GetSpaceliftClient(r.Client, req.Namespace) + if err != nil { + return ctrl.Result{}, err + } + + var query struct { + Stack struct { + ID string `graphql:"id"` + Administrative bool `graphql:"administrative"` + } `graphql:"stack(id: $id)"` + } + + variables := map[string]interface{}{ + "id": graphql.ID("end-to-end-autoconfirm"), + } + + err = spaceliftClient.Query(context.Background(), &query, variables) + if err != nil { + return ctrl.Result{}, err + } + + logger.Info("Succesfully fetched info for stack", "id", query.Stack.ID, "administrative", query.Stack.Administrative) // TODO(user): your logic here From c091d5c18ad4c4888da80845aabbc51ecb0cccbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Goli=C5=84ski?= Date: Fri, 1 Mar 2024 15:04:25 +0100 Subject: [PATCH 03/13] skip client test for now --- client/client_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/client_test.go b/client/client_test.go index 1725297..d7e7adf 100644 --- a/client/client_test.go +++ b/client/client_test.go @@ -11,6 +11,8 @@ import ( ) func TestClient(t *testing.T) { + t.Skip("skipping test") + // TODO(michal): Make this test more useful, this is just a simple test that checks if client is working endpoint := os.Getenv("SPACELIFT_API_KEY_ENDPOINT") keyID := os.Getenv("SPACELIFT_API_KEY_ID") From 2802812d3a6d919c9ef008c9be329e160bc60372 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Goli=C5=84ski?= Date: Fri, 1 Mar 2024 15:05:26 +0100 Subject: [PATCH 04/13] go mod tidy --- go.mod | 8 ++------ go.sum | 8 -------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index 1418c16..c025f69 100644 --- a/go.mod +++ b/go.mod @@ -7,12 +7,11 @@ toolchain go1.21.4 require ( github.com/fatih/color v1.16.0 github.com/nwidger/jsoncolor v0.3.2 - github.com/onsi/ginkgo/v2 v2.13.0 - github.com/onsi/gomega v1.30.0 github.com/shurcooL/graphql v0.0.0-20230722043721-ed46e5a46466 github.com/spacelift-io/spacectl v0.30.0 github.com/stretchr/testify v1.8.4 go.uber.org/zap v1.27.0 + k8s.io/api v0.28.0 k8s.io/apimachinery v0.28.0 k8s.io/client-go v0.28.0 sigs.k8s.io/controller-runtime v0.16.0 @@ -30,7 +29,6 @@ require ( github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.22.3 // indirect - github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect @@ -38,7 +36,6 @@ require ( github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect github.com/google/uuid v1.3.0 // indirect github.com/imdario/mergo v0.3.6 // indirect github.com/josharian/intern v1.0.0 // indirect @@ -50,6 +47,7 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/onsi/ginkgo/v2 v2.13.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_golang v1.16.0 // indirect @@ -65,14 +63,12 @@ require ( golang.org/x/term v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.12.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.28.0 // indirect k8s.io/apiextensions-apiserver v0.28.0 // indirect k8s.io/component-base v0.28.0 // indirect k8s.io/klog/v2 v2.100.1 // indirect diff --git a/go.sum b/go.sum index 3b86680..73d1984 100644 --- a/go.sum +++ b/go.sum @@ -13,9 +13,6 @@ github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqy github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= @@ -84,7 +81,6 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -158,7 +154,6 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= @@ -215,8 +210,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= @@ -239,7 +232,6 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= From 63f2af0ce7f86a2a4ea60465daf7e325e09d3a0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Goli=C5=84ski?= Date: Fri, 1 Mar 2024 15:10:32 +0100 Subject: [PATCH 05/13] lint --- client/client.go | 14 ++++++-------- internal/controller/stack_controller.go | 2 +- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/client/client.go b/client/client.go index 57b0dee..b566c83 100644 --- a/client/client.go +++ b/client/client.go @@ -5,22 +5,20 @@ import ( "net/http" "github.com/shurcooL/graphql" - v1 "k8s.io/api/core/v1" - k8sclient "sigs.k8s.io/controller-runtime/pkg/client" - spacectl "github.com/spacelift-io/spacectl/client" "github.com/spacelift-io/spacectl/client/session" + v1 "k8s.io/api/core/v1" + k8sclient "sigs.k8s.io/controller-runtime/pkg/client" ) // SpaceliftClient is the authenticated client that can be used to interact with Spacelift var SpaceliftClient Client const ( - // SecretName - SecretName = "spacelift-credentials" - SpaceliftApiKeyEndpointKey = "SPACELIFT_API_KEY_ENDPOINT" - SpaceliftApiKeyIDKey = "SPACELIFT_API_KEY_ID" - SpaceliftApiKeySecretKey = "SPACELIFT_API_KEY_SECRET" + SecretName = "spacelift-credentials" //nolint:gosec + SpaceliftApiKeyEndpointKey = "SPACELIFT_API_KEY_ENDPOINT" //nolint:gosec + SpaceliftApiKeyIDKey = "SPACELIFT_API_KEY_ID" //nolint:gosec + SpaceliftApiKeySecretKey = "SPACELIFT_API_KEY_SECRET" //nolint:gosec ) func GetSpaceliftClient(c k8sclient.Client, namespace string) (Client, error) { diff --git a/internal/controller/stack_controller.go b/internal/controller/stack_controller.go index 11c2e43..dfeedc7 100644 --- a/internal/controller/stack_controller.go +++ b/internal/controller/stack_controller.go @@ -19,12 +19,12 @@ package controller import ( "context" + "github.com/shurcooL/graphql" "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" - "github.com/shurcooL/graphql" appspaceliftiov1beta1 "github.com/spacelift-io/spacelift-operator/api/v1beta1" spaceliftclient "github.com/spacelift-io/spacelift-operator/client" ) From cbced2f2c60d18811d5dcbdfbd408edbe5e8ec48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Goli=C5=84ski?= Date: Fri, 1 Mar 2024 18:55:35 +0100 Subject: [PATCH 06/13] move client to internal/spacelift --- internal/controller/stack_controller.go | 2 +- {client => internal/spacelift/client}/client.go | 0 {client => internal/spacelift/client}/client_test.go | 2 +- {client => internal/spacelift/client}/interface.go | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename {client => internal/spacelift/client}/client.go (100%) rename {client => internal/spacelift/client}/client_test.go (93%) rename {client => internal/spacelift/client}/interface.go (100%) diff --git a/internal/controller/stack_controller.go b/internal/controller/stack_controller.go index dfeedc7..2655aa1 100644 --- a/internal/controller/stack_controller.go +++ b/internal/controller/stack_controller.go @@ -26,7 +26,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/log" appspaceliftiov1beta1 "github.com/spacelift-io/spacelift-operator/api/v1beta1" - spaceliftclient "github.com/spacelift-io/spacelift-operator/client" + spaceliftclient "github.com/spacelift-io/spacelift-operator/internal/spacelift/client" ) // StackReconciler reconciles a Stack object diff --git a/client/client.go b/internal/spacelift/client/client.go similarity index 100% rename from client/client.go rename to internal/spacelift/client/client.go diff --git a/client/client_test.go b/internal/spacelift/client/client_test.go similarity index 93% rename from client/client_test.go rename to internal/spacelift/client/client_test.go index d7e7adf..dae0ebd 100644 --- a/client/client_test.go +++ b/internal/spacelift/client/client_test.go @@ -6,7 +6,7 @@ import ( "testing" "github.com/shurcooL/graphql" - "github.com/spacelift-io/spacelift-operator/client" + "github.com/spacelift-io/spacelift-operator/internal/spacelift/client" "github.com/stretchr/testify/assert" ) diff --git a/client/interface.go b/internal/spacelift/client/interface.go similarity index 100% rename from client/interface.go rename to internal/spacelift/client/interface.go From 71357f51a13f3ed39c899ca7236eef48a82b4257 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Goli=C5=84ski?= Date: Fri, 1 Mar 2024 18:57:33 +0100 Subject: [PATCH 07/13] pass context to get spacelit client func --- internal/controller/stack_controller.go | 2 +- internal/spacelift/client/client.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/controller/stack_controller.go b/internal/controller/stack_controller.go index 2655aa1..22eb3f2 100644 --- a/internal/controller/stack_controller.go +++ b/internal/controller/stack_controller.go @@ -51,7 +51,7 @@ type StackReconciler struct { func (r *StackReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { logger := log.FromContext(ctx) - spaceliftClient, err := spaceliftclient.GetSpaceliftClient(r.Client, req.Namespace) + spaceliftClient, err := spaceliftclient.GetSpaceliftClient(ctx, r.Client, req.Namespace) if err != nil { return ctrl.Result{}, err } diff --git a/internal/spacelift/client/client.go b/internal/spacelift/client/client.go index b566c83..8064836 100644 --- a/internal/spacelift/client/client.go +++ b/internal/spacelift/client/client.go @@ -21,15 +21,15 @@ const ( SpaceliftApiKeySecretKey = "SPACELIFT_API_KEY_SECRET" //nolint:gosec ) -func GetSpaceliftClient(c k8sclient.Client, namespace string) (Client, error) { +func GetSpaceliftClient(ctx context.Context, client k8sclient.Client, namespace string) (Client, error) { if SpaceliftClient != nil { return SpaceliftClient, nil } var secret v1.Secret - if err := c.Get( - context.Background(), + if err := client.Get( + ctx, k8sclient.ObjectKey{ Namespace: namespace, Name: SecretName, From 06f9242f369d077fd5bc173c3f2e356a66aaa0be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Goli=C5=84ski?= Date: Fri, 1 Mar 2024 18:59:24 +0100 Subject: [PATCH 08/13] Do not export spaceliftClient field --- internal/spacelift/client/client.go | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/internal/spacelift/client/client.go b/internal/spacelift/client/client.go index 8064836..1fb7eb6 100644 --- a/internal/spacelift/client/client.go +++ b/internal/spacelift/client/client.go @@ -4,6 +4,7 @@ import ( "context" "net/http" + "github.com/pkg/errors" "github.com/shurcooL/graphql" spacectl "github.com/spacelift-io/spacectl/client" "github.com/spacelift-io/spacectl/client/session" @@ -11,8 +12,8 @@ import ( k8sclient "sigs.k8s.io/controller-runtime/pkg/client" ) -// SpaceliftClient is the authenticated client that can be used to interact with Spacelift -var SpaceliftClient Client +// spaceliftClient is the authenticated client that can be used to interact with Spacelift +var spaceliftClient Client const ( SecretName = "spacelift-credentials" //nolint:gosec @@ -22,8 +23,8 @@ const ( ) func GetSpaceliftClient(ctx context.Context, client k8sclient.Client, namespace string) (Client, error) { - if SpaceliftClient != nil { - return SpaceliftClient, nil + if spaceliftClient != nil { + return spaceliftClient, nil } var secret v1.Secret @@ -36,21 +37,21 @@ func GetSpaceliftClient(ctx context.Context, client k8sclient.Client, namespace }, &secret, ); err != nil { - return nil, err + return nil, errors.Wrap(err, "failed to get spacelift credentials secret") } endpoint := string(secret.Data[SpaceliftApiKeyEndpointKey]) apiKeyID := string(secret.Data[SpaceliftApiKeyIDKey]) apiKeySecret := string(secret.Data[SpaceliftApiKeySecretKey]) - spaceliftClient, err := New(endpoint, apiKeyID, apiKeySecret) + newSpaceliftClient, err := New(endpoint, apiKeyID, apiKeySecret) if err != nil { - return nil, err + return nil, errors.Wrap(err, "failed to create spacelift client") } - SpaceliftClient = spaceliftClient + spaceliftClient = newSpaceliftClient - return SpaceliftClient, nil + return spaceliftClient, nil } type client struct { From 2a17aee18f83ed5c8b2f21464a43d3a1d4c95e79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Goli=C5=84ski?= Date: Fri, 1 Mar 2024 19:00:07 +0100 Subject: [PATCH 09/13] remove client_test --- internal/spacelift/client/client_test.go | 40 ------------------------ 1 file changed, 40 deletions(-) delete mode 100644 internal/spacelift/client/client_test.go diff --git a/internal/spacelift/client/client_test.go b/internal/spacelift/client/client_test.go deleted file mode 100644 index dae0ebd..0000000 --- a/internal/spacelift/client/client_test.go +++ /dev/null @@ -1,40 +0,0 @@ -package client_test - -import ( - "context" - "os" - "testing" - - "github.com/shurcooL/graphql" - "github.com/spacelift-io/spacelift-operator/internal/spacelift/client" - "github.com/stretchr/testify/assert" -) - -func TestClient(t *testing.T) { - t.Skip("skipping test") - - // TODO(michal): Make this test more useful, this is just a simple test that checks if client is working - endpoint := os.Getenv("SPACELIFT_API_KEY_ENDPOINT") - keyID := os.Getenv("SPACELIFT_API_KEY_ID") - keySecret := os.Getenv("SPACELIFT_API_KEY_SECRET") - - spaceliftCli, err := client.New(endpoint, keyID, keySecret) - assert.Nil(t, err) - - var query struct { - Stack struct { - ID string `graphql:"id"` - Administrative bool `graphql:"administrative"` - } `graphql:"stack(id: $id)"` - } - - variables := map[string]interface{}{ - "id": graphql.ID("end-to-end-autoconfirm"), - } - - err = spaceliftCli.Query(context.Background(), &query, variables) - assert.Nil(t, err) - - assert.Equal(t, query.Stack.ID, "end-to-end-autoconfirm") - assert.True(t, query.Stack.Administrative) -} From 67e5b2f0ba3dec7edab85ea7d06d6221a0c770fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Goli=C5=84ski?= Date: Fri, 1 Mar 2024 19:01:14 +0100 Subject: [PATCH 10/13] remove unused spacelift client interface functions --- internal/spacelift/client/interface.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/internal/spacelift/client/interface.go b/internal/spacelift/client/interface.go index 64e1d85..448093f 100644 --- a/internal/spacelift/client/interface.go +++ b/internal/spacelift/client/interface.go @@ -2,7 +2,6 @@ package client import ( "context" - "net/http" "github.com/shurcooL/graphql" ) @@ -14,10 +13,4 @@ type Client interface { // Mutate executes a single GraphQL mutation request. Mutate(context.Context, interface{}, map[string]interface{}, ...graphql.RequestOption) error - - // URL returns a full URL given a formatted path. - URL(string, ...interface{}) string - - // Do executes an authenticated http request to the Spacelift API - Do(r *http.Request) (*http.Response, error) } From 9479ae01a1886f70650824e0896d2421d96f5141 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Goli=C5=84ski?= Date: Fri, 1 Mar 2024 19:02:12 +0100 Subject: [PATCH 11/13] add todo comment --- internal/controller/stack_controller.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/controller/stack_controller.go b/internal/controller/stack_controller.go index 22eb3f2..a5da6c4 100644 --- a/internal/controller/stack_controller.go +++ b/internal/controller/stack_controller.go @@ -51,6 +51,7 @@ type StackReconciler struct { func (r *StackReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { logger := log.FromContext(ctx) + // TODO(michal): it's just an exapmle usage of a client spaceliftClient, err := spaceliftclient.GetSpaceliftClient(ctx, r.Client, req.Namespace) if err != nil { return ctrl.Result{}, err From f9ea5430726449fbf2ad2866f2e67ba27b9e5477 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Goli=C5=84ski?= Date: Fri, 1 Mar 2024 19:03:56 +0100 Subject: [PATCH 12/13] wrap one more error and remove unused functions --- internal/spacelift/client/client.go | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/internal/spacelift/client/client.go b/internal/spacelift/client/client.go index 1fb7eb6..226876a 100644 --- a/internal/spacelift/client/client.go +++ b/internal/spacelift/client/client.go @@ -2,7 +2,6 @@ package client import ( "context" - "net/http" "github.com/pkg/errors" "github.com/shurcooL/graphql" @@ -64,7 +63,7 @@ func New(endpoint, keyID, keySecret string) (*client, error) { session, err := session.FromAPIKey(ctx, httpClient)(endpoint, keyID, keySecret) if err != nil { - return nil, err + return nil, errors.Wrap(err, "failed to create spacelift session") } spaceliftClient := spacectl.New(httpClient, session) @@ -79,11 +78,3 @@ func (c *client) Mutate(ctx context.Context, mutation interface{}, variables map func (c *client) Query(ctx context.Context, query interface{}, variables map[string]interface{}, opts ...graphql.RequestOption) error { return c.wraps.Query(ctx, query, variables, opts...) } - -func (c *client) URL(format string, a ...interface{}) string { - return c.wraps.URL(format, a...) -} - -func (c *client) Do(req *http.Request) (*http.Response, error) { - return c.wraps.Do(req) -} From ca8dec01c5a1eb56ef8cc13e11fda95450e7de33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Goli=C5=84ski?= Date: Fri, 1 Mar 2024 19:06:42 +0100 Subject: [PATCH 13/13] go mod tidy --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index c025f69..51be31f 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ toolchain go1.21.4 require ( github.com/fatih/color v1.16.0 github.com/nwidger/jsoncolor v0.3.2 + github.com/pkg/errors v0.9.1 github.com/shurcooL/graphql v0.0.0-20230722043721-ed46e5a46466 github.com/spacelift-io/spacectl v0.30.0 github.com/stretchr/testify v1.8.4 @@ -48,7 +49,6 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/onsi/ginkgo/v2 v2.13.0 // indirect - github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_golang v1.16.0 // indirect github.com/prometheus/client_model v0.4.0 // indirect