clean up docs and test

This commit is contained in:
天元
2020-07-31 12:18:17 +08:00
parent 89601bee18
commit dcf311cd4a
31 changed files with 78 additions and 815 deletions
+5 -50
View File
@@ -1,9 +1,3 @@
# Image URL to use all building/pushing image targets
IMG ?= controller:latest
# Produce CRDs that work back to Kubernetes 1.11 (no version conversion)
CRD_OPTIONS ?= "crd:trivialVersions=true"
# Rudrx version
RUDRX_VERSION ?= 0.1.0
# Repo info
@@ -16,38 +10,20 @@ else
GOBIN=$(shell go env GOBIN)
endif
all: manager
all: build
# Run tests
test: generate fmt vet manifests
test: fmt vet
go test ./... -coverprofile cover.out
# Build manager binary
manager: generate fmt vet
go build -o bin/manager cmd/server/main.go
build: fmt vet
go build -ldflags "-X main.RudrxVersion=${RUDRX_VERSION} -X main.GitRevision=${GIT_COMMIT}" -o bin/rudrx cmd/rudrx/main.go
# Run against the configured Kubernetes cluster in ~/.kube/config
run: generate fmt vet manifests
run: fmt vet
go run ./cmd/server/main.go
# Install CRDs into a cluster
install: manifests
kustomize build config/crd | kubectl apply -f -
# Uninstall CRDs from a cluster
uninstall: manifests
kustomize build config/crd | kubectl delete -f -
# Deploy controller in the configured Kubernetes cluster in ~/.kube/config
deploy: manifests
cd config/manager && kustomize edit set image controller=${IMG}
kustomize build config/default | kubectl apply -f -
# Generate manifests e.g. CRD, RBAC etc.
manifests: controller-gen
$(CONTROLLER_GEN) $(CRD_OPTIONS) rbac:roleName=manager-role webhook paths="./..." output:crd:artifacts:config=config/crd/bases
# Run go fmt against code
fmt:
go fmt ./...
@@ -56,10 +32,6 @@ fmt:
vet:
go vet ./...
# Generate code
generate: controller-gen
$(CONTROLLER_GEN) object:headerFile="hack/boilerplate.go.txt" paths="./..."
# Build the docker image
docker-build: test
docker build . -t ${IMG}
@@ -68,29 +40,12 @@ docker-build: test
docker-push:
docker push ${IMG}
# find or download controller-gen
# download controller-gen if necessary
controller-gen:
ifeq (, $(shell which controller-gen))
@{ \
set -e ;\
CONTROLLER_GEN_TMP_DIR=$$(mktemp -d) ;\
cd $$CONTROLLER_GEN_TMP_DIR ;\
go mod init tmp ;\
go get sigs.k8s.io/controller-tools/cmd/controller-gen@v0.2.5 ;\
rm -rf $$CONTROLLER_GEN_TMP_DIR ;\
}
CONTROLLER_GEN=$(GOBIN)/controller-gen
else
CONTROLLER_GEN=$(shell which controller-gen)
endif
e2e-setup:
# install oam-k8s-runtime
e2e-test:
# Run e2e test
go test .pkg/test
go test ./pkg/test
e2e-cleanup:
# Clean up
+2 -2
View File
@@ -83,9 +83,9 @@ func newCommand() *cobra.Command {
cmds.AddCommand(
cmd.NewRunCommand(f, client, ioStream, os.Args[1:]),
cmd.NewTraitsCommand(f, client, ioStream),
cmd.NewTraitsCommand(f, client, ioStream, []string{}),
cmd.NewWorkloadsCommand(f, client, ioStream, os.Args[1:]),
cmd.NewBindCommand(f, client, ioStream),
cmd.NewBindCommand(f, client, ioStream, []string{}),
cmd.NewInitCommand(f, client, ioStream),
cmd.NewDeleteCommand(f, client, ioStream, os.Args[1:]),
cmd.NewAppsCommand(f, client, ioStream),
-84
View File
@@ -1,84 +0,0 @@
/*
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package main
import (
"flag"
"os"
"k8s.io/apimachinery/pkg/runtime"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
coreoamdevv1alpha2 "github.com/cloud-native-application/rudrx/api/v1alpha2"
"github.com/cloud-native-application/rudrx/controllers"
// +kubebuilder:scaffold:imports
)
var (
scheme = runtime.NewScheme()
setupLog = ctrl.Log.WithName("setup")
)
func init() {
_ = clientgoscheme.AddToScheme(scheme)
_ = coreoamdevv1alpha2.AddToScheme(scheme)
// +kubebuilder:scaffold:scheme
}
func main() {
var metricsAddr string
var enableLeaderElection bool
flag.StringVar(&metricsAddr, "metrics-addr", ":8080", "The address the metric endpoint binds to.")
flag.BoolVar(&enableLeaderElection, "enable-leader-election", false,
"Enable leader election for controller manager. "+
"Enabling this will ensure there is only one active controller manager.")
flag.Parse()
ctrl.SetLogger(zap.New(zap.UseDevMode(true)))
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
Scheme: scheme,
MetricsBindAddress: metricsAddr,
Port: 9443,
LeaderElection: enableLeaderElection,
LeaderElectionID: "285a4034.my.domain",
})
if err != nil {
setupLog.Error(err, "unable to start manager")
os.Exit(1)
}
if err = (&controllers.TemplateReconciler{
Client: mgr.GetClient(),
Log: ctrl.Log.WithName("controllers").WithName("Template"),
Scheme: mgr.GetScheme(),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "Template")
os.Exit(1)
}
// +kubebuilder:scaffold:builder
setupLog.Info("starting manager")
if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
setupLog.Error(err, "problem running manager")
os.Exit(1)
}
}
@@ -1,84 +0,0 @@
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.2.5
creationTimestamp: null
name: templates.admin.oam.dev
spec:
group: admin.oam.dev
names:
kind: Template
listKind: TemplateList
plural: templates
singular: template
scope: Namespaced
validation:
openAPIV3Schema:
description: Template is the Schema for the templates API
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
spec:
description: TemplateSpec defines the desired state of Template
properties:
lastCommandParam:
type: string
object:
description: 'INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
Important: Run "make" to regenerate code after modifying this file'
type: object
parameters:
items:
properties:
default:
type: string
fieldPaths:
items:
type: string
type: array
name:
type: string
required:
type: boolean
short:
type: string
type:
type: string
usage:
type: string
required:
- fieldPaths
- name
type: object
type: array
required:
- object
type: object
status:
description: TemplateStatus defines the observed state of Template
type: object
type: object
version: v1alpha2
versions:
- name: v1alpha2
served: true
storage: true
status:
acceptedNames:
kind: ""
plural: ""
conditions: []
storedVersions: []
-11
View File
@@ -1,11 +0,0 @@
# This kustomization.yaml is not intended to be run by itself,
# since it depends on service name and namespace that are out of this kustomize package.
# It should be run by config/default
resources:
- bases/admin.oam.dev_templates.yaml
# +kubebuilder:scaffold:crdkustomizeresource
# the following config is for teaching kustomize how to do kustomization for CRDs.
configurations:
- kustomizeconfig.yaml
-3
View File
@@ -1,3 +0,0 @@
# This file is for teaching kustomize how to substitute name and namespace reference in CRD
varReference:
- path: metadata/annotations
-70
View File
@@ -1,70 +0,0 @@
# Adds namespace to all resources.
namespace: rudrx-system
# Value of this field is prepended to the
# names of all resources, e.g. a deployment named
# "wordpress" becomes "alices-wordpress".
# Note that it should also match with the prefix (text before '-') of the namespace
# field above.
namePrefix: rudrx-
# Labels to add to all resources and selectors.
#commonLabels:
# someName: someValue
bases:
- ../crd
- ../rbac
- ../manager
# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in
# crd/kustomization.yaml
#- ../webhook
# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'. 'WEBHOOK' components are required.
#- ../certmanager
# [PROMETHEUS] To enable prometheus monitor, uncomment all sections with 'PROMETHEUS'.
#- ../prometheus
patchesStrategicMerge:
# Protect the /metrics endpoint by putting it behind auth.
# If you want your controller-manager to expose the /metrics
# endpoint w/o any authn/z, please comment the following line.
- manager_auth_proxy_patch.yaml
# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in
# crd/kustomization.yaml
#- manager_webhook_patch.yaml
# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'.
# Uncomment 'CERTMANAGER' sections in crd/kustomization.yaml to enable the CA injection in the admission webhooks.
# 'CERTMANAGER' needs to be enabled to use ca injection
#- webhookcainjection_patch.yaml
# the following config is for teaching kustomize how to do var substitution
vars:
# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER' prefix.
#- name: CERTIFICATE_NAMESPACE # namespace of the certificate CR
# objref:
# kind: Certificate
# group: cert-manager.io
# version: v1alpha2
# name: serving-cert # this name should match the one in certificate.yaml
# fieldref:
# fieldpath: metadata.namespace
#- name: CERTIFICATE_NAME
# objref:
# kind: Certificate
# group: cert-manager.io
# version: v1alpha2
# name: serving-cert # this name should match the one in certificate.yaml
#- name: SERVICE_NAMESPACE # namespace of the service
# objref:
# kind: Service
# version: v1
# name: webhook-service
# fieldref:
# fieldpath: metadata.namespace
#- name: SERVICE_NAME
# objref:
# kind: Service
# version: v1
# name: webhook-service
@@ -1,25 +0,0 @@
# This patch inject a sidecar container which is a HTTP proxy for the
# controller manager, it performs RBAC authorization against the Kubernetes API using SubjectAccessReviews.
apiVersion: apps/v1
kind: Deployment
metadata:
name: controller-manager
namespace: system
spec:
template:
spec:
containers:
- name: kube-rbac-proxy
image: gcr.io/kubebuilder/kube-rbac-proxy:v0.5.0
args:
- "--secure-listen-address=0.0.0.0:8443"
- "--upstream=http://127.0.0.1:8080/"
- "--logtostderr=true"
- "--v=10"
ports:
- containerPort: 8443
name: https
- name: manager
args:
- "--metrics-addr=127.0.0.1:8080"
- "--enable-leader-election"
-2
View File
@@ -1,2 +0,0 @@
resources:
- manager.yaml
-39
View File
@@ -1,39 +0,0 @@
apiVersion: v1
kind: Namespace
metadata:
labels:
control-plane: controller-manager
name: system
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: controller-manager
namespace: system
labels:
control-plane: controller-manager
spec:
selector:
matchLabels:
control-plane: controller-manager
replicas: 1
template:
metadata:
labels:
control-plane: controller-manager
spec:
containers:
- command:
- /manager
args:
- --enable-leader-election
image: controller:latest
name: manager
resources:
limits:
cpu: 100m
memory: 30Mi
requests:
cpu: 100m
memory: 20Mi
terminationGracePeriodSeconds: 10
@@ -1,7 +0,0 @@
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: metrics-reader
rules:
- nonResourceURLs: ["/metrics"]
verbs: ["get"]
-13
View File
@@ -1,13 +0,0 @@
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: proxy-role
rules:
- apiGroups: ["authentication.k8s.io"]
resources:
- tokenreviews
verbs: ["create"]
- apiGroups: ["authorization.k8s.io"]
resources:
- subjectaccessreviews
verbs: ["create"]
-12
View File
@@ -1,12 +0,0 @@
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: proxy-rolebinding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: proxy-role
subjects:
- kind: ServiceAccount
name: default
namespace: system
-14
View File
@@ -1,14 +0,0 @@
apiVersion: v1
kind: Service
metadata:
labels:
control-plane: controller-manager
name: controller-manager-metrics-service
namespace: system
spec:
ports:
- name: https
port: 8443
targetPort: https
selector:
control-plane: controller-manager
-12
View File
@@ -1,12 +0,0 @@
resources:
- role.yaml
- role_binding.yaml
- leader_election_role.yaml
- leader_election_role_binding.yaml
# Comment the following 4 lines if you want to disable
# the auth proxy (https://github.com/brancz/kube-rbac-proxy)
# which protects your /metrics endpoint.
- auth_proxy_service.yaml
- auth_proxy_role.yaml
- auth_proxy_role_binding.yaml
- auth_proxy_client_clusterrole.yaml
-32
View File
@@ -1,32 +0,0 @@
# permissions to do leader election.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: leader-election-role
rules:
- apiGroups:
- ""
resources:
- configmaps
verbs:
- get
- list
- watch
- create
- update
- patch
- delete
- apiGroups:
- ""
resources:
- configmaps/status
verbs:
- get
- update
- patch
- apiGroups:
- ""
resources:
- events
verbs:
- create
@@ -1,12 +0,0 @@
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: leader-election-rolebinding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: leader-election-role
subjects:
- kind: ServiceAccount
name: default
namespace: system
-28
View File
@@ -1,28 +0,0 @@
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
creationTimestamp: null
name: manager-role
rules:
- apiGroups:
- admin.oam.dev
resources:
- templates
verbs:
- create
- delete
- get
- list
- patch
- update
- watch
- apiGroups:
- admin.oam.dev
resources:
- templates/status
verbs:
- get
- patch
- update
-12
View File
@@ -1,12 +0,0 @@
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: manager-rolebinding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: manager-role
subjects:
- kind: ServiceAccount
name: default
namespace: system
-24
View File
@@ -1,24 +0,0 @@
# permissions for end users to edit templates.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: template-editor-role
rules:
- apiGroups:
- admin.oam.dev
resources:
- templates
verbs:
- create
- delete
- get
- list
- patch
- update
- watch
- apiGroups:
- admin.oam.dev
resources:
- templates/status
verbs:
- get
-20
View File
@@ -1,20 +0,0 @@
# permissions for end users to view templates.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: template-viewer-role
rules:
- apiGroups:
- admin.oam.dev
resources:
- templates
verbs:
- get
- list
- watch
- apiGroups:
- admin.oam.dev
resources:
- templates/status
verbs:
- get
-79
View File
@@ -1,79 +0,0 @@
/*
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package controllers
import (
"path/filepath"
"testing"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"k8s.io/client-go/rest"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/envtest"
"sigs.k8s.io/controller-runtime/pkg/envtest/printer"
logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
// +kubebuilder:scaffold:imports
)
// These tests use Ginkgo (BDD-style Go testing framework). Refer to
// http://onsi.github.io/ginkgo/ to learn more about Ginkgo.
var cfg *rest.Config
var k8sClient client.Client
var testEnv *envtest.Environment
func TestAPIs(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecsWithDefaultAndCustomReporters(t,
"Controller Suite",
[]Reporter{printer.NewlineReporter{}})
}
var _ = BeforeSuite(func(done Done) {
logf.SetLogger(zap.LoggerTo(GinkgoWriter, true))
By("bootstrapping test environment")
testEnv = &envtest.Environment{
CRDDirectoryPaths: []string{filepath.Join("..", "config", "crd", "bases")},
}
// TODO add later
// var err error
// cfg, err = testEnv.Start()
// Expect(err).ToNot(HaveOccurred())
// Expect(cfg).ToNot(BeNil())
// err = coreoamdevv1alpha2.AddToScheme(scheme.Scheme)
// Expect(err).NotTo(HaveOccurred())
// // +kubebuilder:scaffold:scheme
// k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme})
// Expect(err).ToNot(HaveOccurred())
// Expect(k8sClient).ToNot(BeNil())
close(done)
}, 60)
var _ = AfterSuite(func() {
By("tearing down the test environment")
err := testEnv.Stop()
Expect(err).ToNot(HaveOccurred())
})
+9 -11
View File
@@ -29,7 +29,7 @@ func NewCommandOptions(ioStreams cmdutil.IOStreams) *commandOptions {
return &commandOptions{IOStreams: ioStreams}
}
func NewBindCommand(f cmdutil.Factory, c client.Client, ioStreams cmdutil.IOStreams) *cobra.Command {
func NewBindCommand(f cmdutil.Factory, c client.Client, ioStreams cmdutil.IOStreams, args []string) *cobra.Command {
var err error
@@ -38,7 +38,8 @@ func NewBindCommand(f cmdutil.Factory, c client.Client, ioStreams cmdutil.IOStre
o := NewCommandOptions(ioStreams)
o.Env, err = GetEnv()
if err != nil {
return err
fmt.Printf("Listing trait definitions hit an issue: %v\n", err)
os.Exit(1)
}
o.Client = c
cmd := &cobra.Command{
@@ -52,7 +53,7 @@ func NewBindCommand(f cmdutil.Factory, c client.Client, ioStreams cmdutil.IOStre
cmdutil.CheckErr(o.Run(f, cmd, ctx))
},
}
cmd.SetArgs(args)
var traitDefinitions corev1alpha2.TraitDefinitionList
err = c.List(ctx, &traitDefinitions)
if err != nil {
@@ -63,9 +64,9 @@ func NewBindCommand(f cmdutil.Factory, c client.Client, ioStreams cmdutil.IOStre
for _, t := range traitDefinitions.Items {
var traitTemplate cmdutil.Template
traitTemplate, err := cmdutil.ConvertTemplateJson2Object(t.Spec.Extension)
if err != nil {
fmt.Errorf("applying the trait hit an issue: %s", err)
fmt.Printf("extract template from traitDefinition %v err: %v, ignore it\n", t.Name, err)
continue
}
for _, p := range traitTemplate.Parameters {
@@ -73,6 +74,7 @@ func NewBindCommand(f cmdutil.Factory, c client.Client, ioStreams cmdutil.IOStre
v, err := strconv.Atoi(p.Default)
if err != nil {
fmt.Println("Parameters type is wrong: ", err, ".Please report this to OAM maintainer, thanks.")
os.Exit(1)
}
cmd.PersistentFlags().Int(p.Name, v, p.Usage)
} else {
@@ -90,10 +92,7 @@ func (o *commandOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []
c := o.Client
namespace := cmd.Flag("namespace").Value.String()
if namespace == "" {
namespace = "default"
}
namespace := o.Env.Namespace
if argsLength == 0 {
return errors.New("please append the name of an application. Use `rudr bind -h` for more detailed information")
@@ -172,8 +171,7 @@ func (o *commandOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []
o.AppConfig.Spec.Components = []corev1alpha2.ApplicationConfigurationComponent{{
ComponentName: componentName,
Traits: []corev1alpha2.ComponentTrait{t},
},
}
}}
}
} else {
cmdutil.PrintErrorMessage("Unknown command is specified, please check and try again.", 1)
+2 -40
View File
@@ -1,50 +1,11 @@
package cmd
import (
"testing"
"k8s.io/apimachinery/pkg/runtime"
"github.com/cloud-native-application/rudrx/pkg/test"
)
/*
func TestNewBindCommand(t *testing.T) {
TraitsNotApply := traitDefinitionExample.DeepCopy()
TraitsNotApply.Spec.AppliesToWorkloads = []string{"core.oam.dev/v1alpha2.ContainerizedWorkload"}
cases := map[string]*test.CliTestCase{
"WithNoArgs": {
Resources: test.InitResources{
Create: []runtime.Object{
traitDefinitionExample.DeepCopy(),
//traitTemplateExample.DeepCopy(),
},
},
ExpectedOutput: "Please append the name of an application. Use `rudr bind -h` for more detailed information.",
Args: []string{},
WantException: true,
},
"WithWrongAppconfig": {
Resources: test.InitResources{
Create: []runtime.Object{
traitDefinitionExample.DeepCopy(),
//traitTemplateExample.DeepCopy(),
},
},
ExpectedOutput: "applicationconfigurations.core.oam.dev \"frontend\" not found",
Args: []string{"frontend"},
WantException: true,
},
"TemplateParametersWork": {
Resources: test.InitResources{
Create: []runtime.Object{
traitDefinitionExample.DeepCopy(),
//traitTemplateExample.DeepCopy(),
},
},
ExpectedString: "--replicaCount int",
Args: []string{"-h"},
},
"WorkSuccess": {
Resources: test.InitResources{
Create: []runtime.Object{
@@ -61,3 +22,4 @@ func TestNewBindCommand(t *testing.T) {
test.NewCliTest(t, scheme, NewBindCommand, cases).Run()
}
*/
+45 -69
View File
@@ -26,84 +26,60 @@ func init() {
// used in testing
var (
workloadTemplateExample = &util.Template{
TypeMeta: metav1.TypeMeta{
APIVersion: "admin.oam.dev/v1alpha2",
Kind: "Template",
},
ObjectMeta: metav1.ObjectMeta{
Name: "containerizedworkload-template",
Annotations: map[string]string{
"version": "0.0.1",
},
Namespace: "default",
},
Spec: util.TemplateSpec{
Object: unstructured.Unstructured{
Object: map[string]interface{}{
"apiVersion": "core.oam.dev/v1alpha2",
"kind": "ContainerizedWorkload",
"metadata": map[string]interface{}{
"name": "pod",
},
"spec": map[string]interface{}{
"containers": "",
},
Object: unstructured.Unstructured{
Object: map[string]interface{}{
"apiVersion": "core.oam.dev/v1alpha2",
"kind": "ContainerizedWorkload",
"metadata": map[string]interface{}{
"name": "pod",
},
"spec": map[string]interface{}{
"containers": "",
},
},
LastCommandParam: "image",
Parameters: []util.Parameter{
util.Parameter{
Name: "image",
Short: "i",
Required: true,
Type: "string",
FieldPaths: []string{"spec.containers[0].image"},
},
util.Parameter{
Name: "port",
Short: "p",
Required: false,
Type: "int",
FieldPaths: []string{"spec.containers[0].ports[0].containerPort"},
},
},
LastCommandParam: "image",
Parameters: []util.Parameter{
util.Parameter{
Name: "image",
Short: "i",
Required: true,
Type: "string",
FieldPaths: []string{"spec.containers[0].image"},
},
util.Parameter{
Name: "port",
Short: "p",
Required: false,
Type: "int",
FieldPaths: []string{"spec.containers[0].ports[0].containerPort"},
},
},
}
traitTemplateExample = &util.Template{
TypeMeta: metav1.TypeMeta{
APIVersion: "admin.oam.dev/v1alpha2",
Kind: "Template",
},
ObjectMeta: metav1.ObjectMeta{
Name: "manualscalertrait.core.oam.dev-template",
Annotations: map[string]string{
"version": "0.0.1",
},
Namespace: "default",
},
Spec: util.TemplateSpec{
Object: unstructured.Unstructured{
Object: map[string]interface{}{
"apiVersion": "core.oam.dev/v1alpha2",
"kind": "ManualScalerTrait",
"metadata": map[string]interface{}{
"name": "pod",
},
"spec": map[string]interface{}{
"replicaCount": "2",
},
Object: unstructured.Unstructured{
Object: map[string]interface{}{
"apiVersion": "core.oam.dev/v1alpha2",
"kind": "ManualScalerTrait",
"metadata": map[string]interface{}{
"name": "pod",
},
"spec": map[string]interface{}{
"replicaCount": "2",
},
},
Parameters: []util.Parameter{
util.Parameter{
Name: "replicaCount",
Short: "i",
Required: true,
Type: "int",
FieldPaths: []string{"spec.replicaCount"},
Default: "5",
},
},
Parameters: []util.Parameter{
util.Parameter{
Name: "replicaCount",
Short: "i",
Required: true,
Type: "int",
FieldPaths: []string{"spec.replicaCount"},
Default: "5",
},
},
}
+2 -1
View File
@@ -85,7 +85,8 @@ func runSubRunCommand(parentCmd *cobra.Command, f cmdutil.Factory, c client.Clie
var tmp cmdutil.Template
tmp, err := cmdutil.ConvertTemplateJson2Object(wd.Spec.Extension)
if err != nil {
return fmt.Errorf("deploying application hit an issue: %s", err)
fmt.Printf("extract template from traitDefinition %v err: %v, ignore it\n", wd.Name, err)
continue
}
name := tmp.Alias
workloadNames = append(workloadNames, name)
+2 -8
View File
@@ -1,13 +1,6 @@
package cmd
import (
"testing"
"k8s.io/apimachinery/pkg/runtime"
"github.com/cloud-native-application/rudrx/pkg/test"
)
/*
func TestNewRunCommand(t *testing.T) {
// workloadTemplateExample2 := workloadTemplateExample.DeepCopy()
workloaddefExample2 := workloaddefExample.DeepCopy()
@@ -79,3 +72,4 @@ func TestNewRunCommand(t *testing.T) {
test.NewCliTest(t, scheme, NewRunCommand, cases).Run()
}
*/
+1 -1
View File
@@ -28,7 +28,7 @@ func TestNewTraitCommand(t *testing.T) {
TraitsNotApply,
},
},
ExpectedOutput: "NAME SHORT DEFINITION APPLIES TO STATUS\n",
ExpectedOutput: "NAME ALIAS DEFINITION APPLIES TO STATUS\n",
Args: []string{},
},
}
+2 -2
View File
@@ -12,7 +12,7 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client"
)
func NewTraitsCommand(f cmdutil.Factory, c client.Client, ioStreams cmdutil.IOStreams) *cobra.Command {
func NewTraitsCommand(f cmdutil.Factory, c client.Client, ioStreams cmdutil.IOStreams, args []string) *cobra.Command {
ctx := context.Background()
var workloadName string
cmd := &cobra.Command{
@@ -41,7 +41,7 @@ func printTraitList(ctx context.Context, c client.Client, workloadName *string,
return fmt.Errorf("Listing Trait Definition hit an issue: %s", err)
}
table.AddRow("NAME", "Alias", "DEFINITION", "APPLIES TO", "STATUS")
table.AddRow("NAME", "ALIAS", "DEFINITION", "APPLIES TO", "STATUS")
for _, r := range traitList {
table.AddRow(r.Name, r.Short, r.Definition, r.AppliesTo, r.Status)
}
+8 -1
View File
@@ -18,6 +18,7 @@ package util
import (
"encoding/json"
"fmt"
"k8s.io/apimachinery/pkg/runtime"
@@ -31,7 +32,7 @@ import (
type Template struct {
// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
// Important: Run "make" to regenerate code after modifying this file
Alias string `json:alias,omitempty`
Alias string `json:"alias,omitempty"`
Object unstructured.Unstructured `json:"object,omitempty"`
LastCommandParam string `json:"lastCommandParam,omitempty"`
Parameters []Parameter `json:"parameters,omitempty"`
@@ -51,6 +52,12 @@ type Parameter struct {
func ConvertTemplateJson2Object(in *runtime.RawExtension) (Template, error) {
var t Template
var extension Template
if in == nil {
return t, fmt.Errorf("extension field is nil")
}
if in.Raw == nil {
return t, fmt.Errorf("template object is nil")
}
err := json.Unmarshal(in.Raw, &extension)
if err == nil {
t = extension
-47
View File
@@ -4,60 +4,13 @@ import (
"os"
"os/exec"
"path"
"testing"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/config"
)
var (
rudrPath, _ = os.Getwd()
)
func createKubernetesClient() (client.Client, error) {
c, err := client.New(config.GetConfigOrDie(), client.Options{})
return c, err
}
func TestCreateKubernetesClient(t *testing.T) {
_, err := createKubernetesClient()
if err != nil {
t.Errorf("Failed to create a Kubernetes client: %s", err)
}
}
// TestBuildCliBinary is to build rudr binary.
func TestBuildCliBinary(t *testing.T) {
rudrPath, err := os.Getwd()
mainPath := path.Join(rudrPath, "../../cmd/rudrx/main.go")
if err != nil {
t.Errorf("Failed to build rudr binary: %s", err)
}
cmd := exec.Command("go", "build", "-o", path.Join(rudrPath, "rudr"), mainPath)
stdout, err := cmd.Output()
if err != nil {
t.Errorf("Failed to build rudr binary: %s", err)
}
t.Log(stdout, err)
// TODO(zzxwill) If this failed, all other test-cases should be terminated
}
func Command(name string, arg ...string) *exec.Cmd {
commandName := path.Join(rudrPath, name)
return exec.Command(commandName, arg...)
}
func TestTraitsList(t *testing.T) {
cmd := Command("rudr", []string{"traits", "list"}...)
stdout, err := cmd.Output()
t.Log(string(stdout), err)
if err != nil {
t.Errorf("Failed to list traits: %s", err)
}
}