Skip to content

Commit e51ee08

Browse files
committed
feat: implemented dryrun method
1 parent f640bd9 commit e51ee08

File tree

3 files changed

+54
-5
lines changed

3 files changed

+54
-5
lines changed

gateway/resolver/arguments.go

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ package resolver
22

33
import (
44
"errors"
5-
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
65
"maps"
76
"strings"
87

8+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
9+
910
"github.com/graphql-go/graphql"
1011
"github.com/rs/zerolog/log"
1112
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
@@ -18,6 +19,7 @@ const (
1819
ObjectArg = "object"
1920
SubscribeToAllArg = "subscribeToAll"
2021
SortByArg = "sortBy"
22+
DryRunArg = "dryRun"
2123
)
2224

2325
// FieldConfigArgumentsBuilder helps construct GraphQL field config arguments
@@ -65,6 +67,14 @@ func (b *FieldConfigArgumentsBuilder) WithObject(resourceInputType *graphql.Inpu
6567
return b
6668
}
6769

70+
func (b *FieldConfigArgumentsBuilder) WithDryRun() *FieldConfigArgumentsBuilder {
71+
b.arguments[DryRunArg] = &graphql.ArgumentConfig{
72+
Type: graphql.NewList(graphql.String),
73+
Description: "If true, the object will not be persisted",
74+
}
75+
return b
76+
}
77+
6878
func (b *FieldConfigArgumentsBuilder) WithSubscribeToAll() *FieldConfigArgumentsBuilder {
6979
b.arguments[SubscribeToAllArg] = &graphql.ArgumentConfig{
7080
Type: graphql.Boolean,
@@ -160,3 +170,36 @@ func validateSortBy(items []unstructured.Unstructured, fieldPath string) error {
160170

161171
return nil
162172
}
173+
174+
func getDryRunArg(args map[string]interface{}, key string, required bool) ([]string, error) {
175+
val, exists := args[key]
176+
if !exists {
177+
if required {
178+
err := errors.New("missing required argument: " + key)
179+
log.Error().Err(err).Msg(key + " argument is required")
180+
return nil, err
181+
}
182+
return nil, nil
183+
}
184+
185+
switch v := val.(type) {
186+
case []interface{}:
187+
result := make([]string, len(v))
188+
for i, item := range v {
189+
str, ok := item.(string)
190+
if !ok {
191+
err := errors.New("invalid type in dryRun list: expected string")
192+
log.Error().Err(err).Msg("dryRun argument must be a list of strings")
193+
return nil, err
194+
}
195+
result[i] = str
196+
}
197+
return result, nil
198+
case nil:
199+
return nil, nil
200+
default:
201+
err := errors.New("invalid type for dryRun argument: expected list of strings")
202+
log.Error().Err(err).Msg("dryRun argument must be a list of strings")
203+
return nil, err
204+
}
205+
}

gateway/resolver/resolver.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ import (
55
"encoding/json"
66
"errors"
77
"fmt"
8-
"gopkg.in/yaml.v3"
9-
v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
108
"regexp"
119
"sort"
1210
"strings"
1311

12+
"gopkg.in/yaml.v3"
13+
v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
14+
1415
"github.com/graphql-go/graphql"
1516
"go.opentelemetry.io/otel"
1617
"go.opentelemetry.io/otel/attribute"
@@ -236,7 +237,12 @@ func (r *Service) CreateItem(gvk schema.GroupVersionKind, scope v1.ResourceScope
236237
return nil, errors.New("object metadata.name is required")
237238
}
238239

239-
if err := r.runtimeClient.Create(ctx, obj); err != nil {
240+
dryRun, err := getDryRunArg(p.Args, DryRunArg, false)
241+
if err != nil {
242+
return nil, err
243+
}
244+
245+
if err := r.runtimeClient.Create(ctx, obj, &client.CreateOptions{DryRun: dryRun}); err != nil {
240246
log.Error().Err(err).Msg("Failed to create object")
241247
return nil, err
242248
}

gateway/schema/schema.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ func (g *Gateway) processSingleResource(
201201

202202
itemArgsBuilder := resolver.NewFieldConfigArguments().WithName()
203203

204-
creationMutationArgsBuilder := resolver.NewFieldConfigArguments().WithObject(resourceInputType)
204+
creationMutationArgsBuilder := resolver.NewFieldConfigArguments().WithObject(resourceInputType).WithDryRun()
205205

206206
if resourceScope == apiextensionsv1.NamespaceScoped {
207207
listArgsBuilder.WithNamespace()

0 commit comments

Comments
 (0)