Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

Are you testing the Kubernetes Controller?

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

IUUQTTLB ff PMEEFWEPDTQJQFMJOFTUBHFT

Slide 6

Slide 6 text

#VJME 4LB ff PME ,VCFOFUFTDMVTUFS %FQMPZ 7PMVNFECH *OJU$POUBJOFS %PXOMPBE%FMWF $VTUPN$POUSPMMFS $VTUPN$POUSPMMFS $VTUPN$POUSPMMFS https://github.com/go-delve/delve

Slide 7

Slide 7 text

https://github.com/docker https://github.com/kubernetes-sigs/kind

Slide 8

Slide 8 text

$ kubectl apply -f test-case-1.yaml Before test After test $ kubectl delete -f test-case-1.yaml

Slide 9

Slide 9 text

https://github.com/riita10069/ket

Slide 10

Slide 10 text

Collecting CLIs Executing Command SetUp Cluster Build/Deploy/Debug Manage Resources

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

func Start(ctx context.Context, options ...Option) (*ClientSet, error)

Slide 13

Slide 13 text

type ClientSet struct { ClientGo *k8s.ClientG o Kubectl *kubectl.Kubect l Kind *kind.Kin d Skaffold *skaffold.Skaffol d } err := kubectl.ApplyAllManifest(ctx, tt.fixture.manifestPaths, false) _, err = kubectl.WaitAResource ( ctx , "deploy" , types.NamespacedName { Namespace: "CONTROLLER_NAMESPACE" , Name: "CONTROLLER_NAME" , } , )

Slide 14

Slide 14 text

func (k *Kubectl) ApplyFile(ctx context.Context, filePath string) error { args := []string { "apply" , "-f" , filePath , } err := k.Execute(ctx, args ) if err != nil { return err } return ni l } Self-created Commands!!

Slide 15

Slide 15 text

for _, tt := range tests { tt := t t t.Run(tt.name, func(t *testing.T) { ctx := context.Background( ) err := kubectl.ApplyAllManifest(ctx, tt.fixture.manifestPaths, false ) for _, expect := range tt.res.A.Items { // check expec t } err = kubectl.DeleteAllManifest(ctx, tt.fixture.manifestPaths, true ) } ) } 1st, Create resources “declaratively” Maybe notify informer of the change. 2nd, Make sure the behavior of the Controller. 3rd, Restore the state of the resource.

Slide 16

Slide 16 text

How was it implemented?

Slide 17

Slide 17 text

func Start(ctx context.Context, options ...Option) (*ClientSet, error) { ket := NewKET( ) for _, option := range options { err := option(ket ) if err != nil { return nil, fmt.Errorf("failed to run options: %w", err ) } } cliSet := &ClientSet{ } kind := kind.NewKind(ket.kindVersion, ket.kubernetesVersion, ket.binDir, ket.kubeconfigPath ) cliSet.Kind = kin d err := kind.DeleteCluster(ctx, ket.kindClusterName ) if err != nil { return nil, fmt.Errorf("failed to delete kind cluster %s: %w", ket.kindClusterName, err ) } err = kind.CreateCluster(ctx, ket.kindClusterName ) if err != nil { return nil, fmt.Errorf("failed to create kind cluster %s: %w", ket.kindClusterName, err ) } First, create a Kind cluster.

Slide 18

Slide 18 text

clientGo, err := k8s.NewClientGo(ket.kubeconfigPath ) if err != nil { return nil, fmt.Errorf("failed to create client-go: %w", err ) } cliSet.ClientGo = clientG o kubectl := kubectl.NewKubectl(ket.kubernetesVersion, ket.binDir, ket.kubeconfigPath ) cliSet.Kubectl = kubect l err = kubectl.UseContext(ctx, ket.kindClusterName ) if err != nil { return nil, fmt.Errorf("failed to use context: %w", err ) } err = kubectl.ApplyKustomize(ctx, ket.crdKustomizePath ) if err != nil { return nil, fmt.Errorf("failed to apply crd yaml: %w", err ) } if ket.useSkaffold { skaffold := skaffold.NewSkaffold(ket.skaffoldVersion, ket.binDir, ket.kubeconfigPath ) cliSet.Skaffold = skaffol d err = skaffold.Run(ctx, ket.skaffoldYaml, false ) if err != nil { return nil, fmt.Errorf("failed to skaffold run: %w", err ) } } return cliSet, ni l } Second, Apply CRDs and some Resources. Third, Skaffold run.(if you use Skaffold)

Slide 19

Slide 19 text

https://github.com/riita10069/ket