Files
onepanel/argo/workflow_test.go
2019-12-15 18:47:58 -08:00

222 lines
5.3 KiB
Go

package argo
import (
"flag"
"os"
"testing"
"github.com/onepanelio/core/util/ptr"
)
var TestInstanceWorkflowManifest = []byte(`
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: vscode-
spec:
podGC:
strategy: OnWorkflowCompletion
entrypoint: instance-tmpl
arguments:
parameters:
- name: name
- name: action
- name: machine-type
templates:
- name: instance-tmpl
steps:
- - name: instance-service
template: instance-service-tmpl
- - name: instance-virtual-service
template: instance-virtual-service-tmpl
- - name: instance-statefulset
template: instance-statefulset-tmpl
- name: instance-service-tmpl
metadata:
annotations:
sidecar.istio.io/inject: "false"
nodeSelector:
cloud.google.com/gke-nodepool: default-pool
resource:
action: "{{workflow.parameters.action}}"
manifest: |
apiVersion: v1
kind: Service
metadata:
name: {{workflow.parameters.name}}
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
selector:
instanceUID: {{workflow.parameters.name}}
type: ClusterIP
- name: instance-virtual-service-tmpl
metadata:
annotations:
sidecar.istio.io/inject: "false"
nodeSelector:
cloud.google.com/gke-nodepool: default-pool
resource:
action: "{{workflow.parameters.action}}"
manifest: |
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: {{workflow.parameters.name}}
spec:
hosts:
- {{workflow.parameters.name}}.{{workflow.parameters.host}}
gateways:
- istio-system/ingressgateway
http:
- match:
- uri:
prefix: /
route:
- destination:
port:
number: 80
host: {{workflow.parameters.name}}
- name: instance-statefulset-tmpl
metadata:
annotations:
sidecar.istio.io/inject: "false"
nodeSelector:
cloud.google.com/gke-nodepool: default-pool
resource:
action: "{{workflow.parameters.action}}"
manifest: |
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: {{workflow.parameters.name}}
spec:
replicas: 1
serviceName: {{workflow.parameters.name}}
selector:
matchLabels:
instanceUID: {{workflow.parameters.name}}
template:
metadata:
labels:
instanceUID: {{workflow.parameters.name}}
spec:
nodeSelector:
cloud.google.com/gke-nodepool: {{workflow.parameters.machine-type}}
containers:
- name: main
image: codercom/code-server:v2
args: ["--auth", "none"]
ports:
- containerPort: 80
name: http
volumeMounts:
- name: vol1
mountPath: /home/coder
volumeClaimTemplates:
- metadata:
name: vol1
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: default
resources:
requests:
storage: 1Gi
`)
var (
namespace = flag.String("namespace", "default", "namespace of workflows")
options = &Options{
Namespace: *namespace,
Parameters: []Parameter{
{
Name: "name",
Value: ptr.String("vscode"),
},
{
Name: "machine-type",
Value: ptr.String("default-pool"),
},
{
Name: "host",
Value: ptr.String("test-cluster-11.onepanel.io"),
},
},
}
)
func TestUnmarshalWorkflows(t *testing.T) {
wfs, err := unmarshalWorkflows([]byte(TestInstanceWorkflowManifest), true)
if err != nil {
t.Error(err)
return
}
t.Log(wfs[0])
}
func TestCreateOrResumeInstance(t *testing.T) {
c := NewClient(os.Getenv("KUBECONFIG"))
options.Parameters = append(options.Parameters, Parameter{
Name: "action",
Value: ptr.String("create"),
})
wf, err := c.CreateWorkflow(TestInstanceWorkflowManifest, options)
if err != nil {
t.Error(err)
return
}
t.Log(wf)
}
func TestPauseInstance(t *testing.T) {
c := NewClient(os.Getenv("KUBECONFIG"))
options.Parameters = append(options.Parameters, Parameter{
Name: "action",
Value: ptr.String("delete"),
})
wf, err := c.CreateWorkflow(TestInstanceWorkflowManifest, options)
if err != nil {
t.Error(err)
return
}
t.Log(wf)
}
func TestChangeInstanceMachineType(t *testing.T) {
c := NewClient(os.Getenv("KUBECONFIG"))
options.Parameters = append(options.Parameters, Parameter{
Name: "action",
Value: ptr.String("apply"),
}, Parameter{
Name: "machine-type",
Value: ptr.String("cpu-1-4"),
})
wf, err := c.CreateWorkflow(TestInstanceWorkflowManifest, options)
if err != nil {
t.Error(err)
return
}
t.Log(wf)
}
/**** Some other test scenarios
- System-wide environment variables
- System-wide parameters like `host`
- Startup script that can be executed in:
- Init Container: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
- LifeCycle Hooks: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks
****/