Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP]TNZ-26666KCP provider skeleton + starlark example #267

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
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
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ Crashd utilizes the concept of a provider to enumerate compute resources. Each i
* *Kubernetes Nodes Provider* - extracts host information from a Kubernetes API node objects
* *CAPV Provider* - uses Cluster-API to discover machines in vSphere cluster
* *CAPA Provider* - uses Cluster-API to discover machines running on AWS
* *KCP Provider* - generates kubeconfig with all contexts for all KCP workspaces.
nasioman marked this conversation as resolved.
Show resolved Hide resolved
* More providers coming!
nasioman marked this conversation as resolved.
Show resolved Hide resolved


Expand Down
36 changes: 36 additions & 0 deletions examples/kcp_provider.crsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
## @copyright Copyright Broadcom. All Rights Reserved.
## The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
## @license For licensing, see LICENSE.md.

# object kinds to capture
kinds = [
"space",
"configmap"
]

def configure_work_dir(context):
work_dir = args.workdir if hasattr(args, "workdir") else fail("Error: workdir argument is required but not provided.")
context_dir = work_dir + "/" + context
conf = crashd_config(workdir=context_dir)

def capture_kcp_objects():
kcp_provider_result = kcp_provider(
kcp_admin_secret_namespace="",
kcp_admin_secret_name=""
)

# capture kubernetes objects from all kcp workspaces
for context in kcp_provider_result.contexts:
print("Capturing kcp objects for", context)

# set kubeconfig path and context in threadlocal
set_defaults(kube_config(capi_provider=kcp_provider_result, cluster_context=context))

# configure work directory based on context name - context-name should use "/"
configure_work_dir(context)
kube_capture(what="objects", kinds=kinds, namespaces=["default"])

def main():
capture_kcp_objects()

main()
51 changes: 51 additions & 0 deletions starlark/kcp_provider.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// Copyright (c) 2020 VMware, Inc. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package starlark

import (
"context"
"fmt"

"github.com/pkg/errors"
"go.starlark.net/starlark"
"go.starlark.net/starlarkstruct"
)

// KcpProviderFn is a built-in starlark function that create a kubeconfig with all contexts for all KCP logical clusters
// Starlark format: kcp_provider(ucp_admin_secret_name=<ucp_admin_secret_name> ucp_admin_secret_namespace=<ucp_admin_secret_namespace>)
func KcpProviderFn(thread *starlark.Thread, _ *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {

var (
kcp_admin_secret_name, kcp_admin_secret_namespace string
)

err := starlark.UnpackArgs("kcp_provider", args, kwargs,
"kcp_admin_secret_namespace", &kcp_admin_secret_namespace,
"kcp_admin_secret_name", &kcp_admin_secret_name)
if err != nil {
return starlark.None, errors.Wrap(err, "failed to unpack input arguments")
}

ctx, ok := thread.Local(identifiers.scriptCtx).(context.Context)
if !ok || ctx == nil {
return starlark.None, fmt.Errorf("script context not found")
}

var kcpKubeConfigPath = "/Users/tatanas/dev.kubeconfig"
//TODO Generate a KCP admin kubeconfig

// dictionary for capa provider struct
kcpProviderDict := starlark.StringDict{
"kind": starlark.String(identifiers.kcpProvider),
"kube_config": starlark.String(kcpKubeConfigPath),
}

var contexts []starlark.Value
contexts = append(contexts, starlark.String("tanzu-cli-Falcons_GCP_New-staging-5a2f0150:project-ashindov"))
contexts = append(contexts, starlark.String("tanzu-cli-Falcons_GCP_New-staging-5a2f0150:project-ashindov:services-space"))

kcpProviderDict["contexts"] = starlark.NewList(contexts)
nasioman marked this conversation as resolved.
Show resolved Hide resolved

return starlarkstruct.FromStringDict(starlark.String(identifiers.kcpProvider), kcpProviderDict), nil
}
2 changes: 1 addition & 1 deletion starlark/kube_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ func KubeConfigFn(_ *starlark.Thread, _ *starlark.Builtin, args starlark.Tuple,
val := provider.Constructor()
if constructor, ok := val.(starlark.String); ok {
constStr := constructor.GoString()
if constStr != identifiers.capvProvider && constStr != identifiers.capaProvider {
if constStr != identifiers.capvProvider && constStr != identifiers.capaProvider && constStr != identifiers.kcpProvider {
return starlark.None, errors.New("unknown capi provider")
}
}
Expand Down
1 change: 1 addition & 0 deletions starlark/starlark_exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ func newPredeclareds() starlark.StringDict {
identifiers.kubeNodesProvider: starlark.NewBuiltin(identifiers.kubeNodesProvider, KubeNodesProviderFn),
identifiers.capvProvider: starlark.NewBuiltin(identifiers.capvProvider, CapvProviderFn),
identifiers.capaProvider: starlark.NewBuiltin(identifiers.capaProvider, CapaProviderFn),
identifiers.kcpProvider: starlark.NewBuiltin(identifiers.kcpProvider, KcpProviderFn),
identifiers.setDefaults: starlark.NewBuiltin(identifiers.setDefaults, SetDefaultsFunc),
identifiers.log: starlark.NewBuiltin(identifiers.log, logFunc),
}
Expand Down
2 changes: 2 additions & 0 deletions starlark/support.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ var (
kubeNodesProvider string
capvProvider string
capaProvider string
kcpProvider string

sshAgent string
}{
Expand Down Expand Up @@ -91,6 +92,7 @@ var (
kubeNodesProvider: "kube_nodes_provider",
capvProvider: "capv_provider",
capaProvider: "capa_provider",
kcpProvider: "kcp_provider",

sshAgent: "crashd_ssh_agent",
}
Expand Down
Loading