From a1113f18fd9f0bf8c13bfa92696a7e73d052db22 Mon Sep 17 00:00:00 2001 From: Lency Qian <36918585+LeiQL@users.noreply.github.com> Date: Mon, 22 Jan 2024 10:16:41 +0800 Subject: [PATCH 1/2] enable mqtt test --- .github/workflows/go.yml | 8 ++ .../providers/target/mqtt/mqtt_test.go | 87 +++++++++++++++---- .../apis/v1alpha2/bindings/mqtt/mqtt_test.go | 4 +- 3 files changed, 82 insertions(+), 17 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 4aaf4a518..3c37f8c36 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -16,6 +16,7 @@ jobs: env: TEST_KUBECTL: yes TEST_MINIKUBE_ENABLED: yes + TEST_MQTT_LOCAL_ENABLED: yes steps: - uses: actions/checkout@v3 @@ -49,6 +50,13 @@ jobs: sudo mv minikube /usr/local/bin/ minikube start kubectl config view + + - name: Install Mqtt + run: | + sudo apt-get update + sudo apt-get install mosquitto mosquitto-clients + sudo service mosquitto start + sudo service mosquitto status - name: COA Test run: cd coa && go test -v ./... -run '^[^C]*$|^[^c][^o]*$|^[^c][^o]*o[^n][^f][^o][^r][^m][^a][^n][^c][^e][^C]*$' diff --git a/api/pkg/apis/v1alpha1/providers/target/mqtt/mqtt_test.go b/api/pkg/apis/v1alpha1/providers/target/mqtt/mqtt_test.go index f34e503ca..4a5dfa2a3 100644 --- a/api/pkg/apis/v1alpha1/providers/target/mqtt/mqtt_test.go +++ b/api/pkg/apis/v1alpha1/providers/target/mqtt/mqtt_test.go @@ -21,13 +21,13 @@ import ( ) func TestDoubleIni(t *testing.T) { - testMQTT := os.Getenv("TEST_MQTT") + testMQTT := os.Getenv("TEST_MQTT_LOCAL_ENABLED") if testMQTT == "" { t.Skip("Skipping because TES_MQTT enviornment variable is not set") } config := MQTTTargetProviderConfig{ Name: "me", - BrokerAddress: "tcp://20.118.146.198:1883", + BrokerAddress: "tcp://127.0.0.1:1883", ClientID: "coa-test2", RequestTopic: "coa-request", ResponseTopic: "coa-response", @@ -40,13 +40,13 @@ func TestDoubleIni(t *testing.T) { } func TestInitWithMap(t *testing.T) { - testMQTT := os.Getenv("TEST_MQTT") + testMQTT := os.Getenv("TEST_MQTT_LOCAL_ENABLED") if testMQTT == "" { t.Skip("Skipping because TES_MQTT enviornment variable is not set") } configMap := map[string]string{ "name": "me", - "brokerAddress": "tcp://20.118.146.198:1883", + "brokerAddress": "tcp://127.0.0.1:1883", "clientID": "coa-test2", "requestTopic": "coa-request", "responseTopic": "coa-response", @@ -57,7 +57,7 @@ func TestInitWithMap(t *testing.T) { } func TestInitWithMapInvalidConfig(t *testing.T) { - testMQTT := os.Getenv("TEST_MQTT") + testMQTT := os.Getenv("TEST_MQTT_LOCAL_ENABLED") if testMQTT == "" { t.Skip("Skipping because TES_MQTT enviornment variable is not set") } @@ -70,14 +70,14 @@ func TestInitWithMapInvalidConfig(t *testing.T) { configMap = map[string]string{ "name": "me", - "brokerAddress": "tcp://20.118.146.198:1883", + "brokerAddress": "tcp://127.0.0.1:1883", } err = provider.InitWithMap(configMap) assert.NotNil(t, err) configMap = map[string]string{ "name": "me", - "brokerAddress": "tcp://20.118.146.198:1883", + "brokerAddress": "tcp://127.0.0.1:1883", "clientID": "coa-test2", } err = provider.InitWithMap(configMap) @@ -85,7 +85,7 @@ func TestInitWithMapInvalidConfig(t *testing.T) { configMap = map[string]string{ "name": "me", - "brokerAddress": "tcp://20.118.146.198:1883", + "brokerAddress": "tcp://127.0.0.1:1883", "clientID": "coa-test2", "requestTopic": "coa-request", } @@ -94,7 +94,7 @@ func TestInitWithMapInvalidConfig(t *testing.T) { configMap = map[string]string{ "name": "me", - "brokerAddress": "tcp://20.118.146.198:1883", + "brokerAddress": "tcp://127.0.0.1:1883", "clientID": "coa-test2", "requestTopic": "coa-request", "responseTopic": "coa-response", @@ -105,7 +105,7 @@ func TestInitWithMapInvalidConfig(t *testing.T) { configMap = map[string]string{ "name": "me", - "brokerAddress": "tcp://20.118.146.198:1883", + "brokerAddress": "tcp://127.0.0.1:1883", "clientID": "coa-test2", "requestTopic": "coa-request", "responseTopic": "coa-response", @@ -117,7 +117,7 @@ func TestInitWithMapInvalidConfig(t *testing.T) { configMap = map[string]string{ "name": "me", - "brokerAddress": "tcp://20.118.146.198:1883", + "brokerAddress": "tcp://127.0.0.1:1883", "clientID": "coa-test2", "requestTopic": "coa-request", "responseTopic": "coa-response", @@ -129,7 +129,7 @@ func TestInitWithMapInvalidConfig(t *testing.T) { configMap = map[string]string{ "name": "me", - "brokerAddress": "tcp://20.118.146.198:1883", + "brokerAddress": "tcp://127.0.0.1:1883", "clientID": "coa-test2", "requestTopic": "coa-request", "responseTopic": "coa-response", @@ -148,7 +148,7 @@ func TestGet(t *testing.T) { } config := MQTTTargetProviderConfig{ Name: "me", - BrokerAddress: "tcp://20.118.146.198:1883", + BrokerAddress: "tcp://127.0.0.1:1883", ClientID: "coa-test2", RequestTopic: "coa-request", ResponseTopic: "coa-response", @@ -240,7 +240,7 @@ func TestApply(t *testing.T) { } config := MQTTTargetProviderConfig{ Name: "me", - BrokerAddress: "tcp://20.118.146.198:1883", + BrokerAddress: "tcp://127.0.0.1:1883", ClientID: "coa-test2", RequestTopic: "coa-request", ResponseTopic: "coa-response", @@ -467,10 +467,67 @@ func TestGetApply(t *testing.T) { assert.Nil(t, err) } +func TestLocalApplyGet(t *testing.T) { + testMQTT := os.Getenv("TEST_MQTT_LOCAL_ENABLED") + if testMQTT == "" { + t.Skip("Skipping because TES_MQTT enviornment variable is not set") + } + config := MQTTTargetProviderConfig{ + Name: "me", + BrokerAddress: "tcp://127.0.0.1:1883", + ClientID: "coa-test2", + RequestTopic: "coa-request", + ResponseTopic: "coa-response", + TimeoutSeconds: 8, + } + provider := MQTTTargetProvider{} + err := provider.Init(config) + assert.Nil(t, err) + + opts := gmqtt.NewClientOptions().AddBroker(config.BrokerAddress).SetClientID("test-sender") + opts.SetKeepAlive(2 * time.Second) + opts.SetPingTimeout(1 * time.Second) + + c := gmqtt.NewClient(opts) + if token := c.Connect(); token.Wait() && token.Error() != nil { + panic(token.Error()) + } + if token := c.Subscribe(config.RequestTopic, 0, func(client gmqtt.Client, msg gmqtt.Message) { + var response v1alpha2.COAResponse + response.State = v1alpha2.OK + response.Metadata = make(map[string]string) + var request v1alpha2.COARequest + json.Unmarshal(msg.Payload(), &request) + if request.Method == "GET" { + response.Metadata["call-context"] = "TargetProvider-Get" + ret := make([]model.ComponentSpec, 0) + data, _ := json.Marshal(ret) + response.State = v1alpha2.OK + response.Body = data + } else { + response.Metadata["call-context"] = "TargetProvider-Apply" + response.State = v1alpha2.OK + } + data, _ := json.Marshal(response) + token := c.Publish(config.ResponseTopic, 0, false, data) + token.Wait() + }); token.Wait() && token.Error() != nil { + if token.Error().Error() != "subscription exists" { + panic(token.Error()) + } + } + + _, err = provider.Apply(context.Background(), model.DeploymentSpec{}, model.DeploymentStep{}, false) + assert.Nil(t, err) + arr, err := provider.Get(context.Background(), model.DeploymentSpec{}, nil) + assert.Nil(t, err) + assert.Equal(t, 0, len(arr)) +} + func TestInitFailed(t *testing.T) { config := MQTTTargetProviderConfig{ Name: "me", - BrokerAddress: "tcp://127.0.0.1:1883", + BrokerAddress: "tcp://8.8.8.8:1883", ClientID: "coa-test2", RequestTopic: "coa-request", ResponseTopic: "coa-response", diff --git a/coa/pkg/apis/v1alpha2/bindings/mqtt/mqtt_test.go b/coa/pkg/apis/v1alpha2/bindings/mqtt/mqtt_test.go index 282ef2cca..b2cc233ec 100644 --- a/coa/pkg/apis/v1alpha2/bindings/mqtt/mqtt_test.go +++ b/coa/pkg/apis/v1alpha2/bindings/mqtt/mqtt_test.go @@ -18,13 +18,13 @@ import ( ) func TestMQTTEcho(t *testing.T) { - testMQTT := os.Getenv("TEST_MQTT") + testMQTT := os.Getenv("TEST_MQTT_LOCAL_ENABLED") if testMQTT == "" { t.Skip("Skipping because TES_MQTT enviornment variable is not set") } sig := make(chan int) config := MQTTBindingConfig{ - BrokerAddress: "tcp://20.118.146.198:1883", + BrokerAddress: "tcp://127.0.0.1:1883", ClientID: "coa-test2", RequestTopic: "coa-request", ResponseTopic: "coa-response", From 29b65c8ad75299431b6dfee4e2267984d3d77cbb Mon Sep 17 00:00:00 2001 From: Lency Qian Date: Mon, 29 Jan 2024 10:26:01 +0800 Subject: [PATCH 2/2] Update docker test --- .github/workflows/go.yml | 4 + .../providers/target/docker/docker_test.go | 123 ++++++++++++++++-- 2 files changed, 114 insertions(+), 13 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 3c37f8c36..35212df9f 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -17,6 +17,7 @@ jobs: TEST_KUBECTL: yes TEST_MINIKUBE_ENABLED: yes TEST_MQTT_LOCAL_ENABLED: yes + TEST_DOCKER_ENABLED: yes steps: - uses: actions/checkout@v3 @@ -35,6 +36,9 @@ jobs: - name: Install make run: sudo apt-get update && sudo apt-get install -y build-essential + - name: Check docker version and images + run: docker --version && docker images + - name: Install kubectl run: | curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" diff --git a/api/pkg/apis/v1alpha1/providers/target/docker/docker_test.go b/api/pkg/apis/v1alpha1/providers/target/docker/docker_test.go index 0957c28c3..e962451f8 100644 --- a/api/pkg/apis/v1alpha1/providers/target/docker/docker_test.go +++ b/api/pkg/apis/v1alpha1/providers/target/docker/docker_test.go @@ -146,19 +146,49 @@ func TestDockerTargetProviderRemove(t *testing.T) { assert.Nil(t, err) } -func TestGet(t *testing.T) { +func TestUpdateGetDelete(t *testing.T) { + testDockerProvider := os.Getenv("TEST_DOCKER_ENABLED") + if testDockerProvider == "" { + t.Skip("Skipping because TEST_DOCKER_PROVIDER enviornment variable is not set") + } config := DockerTargetProviderConfig{} provider := DockerTargetProvider{} err := provider.Init(config) assert.Nil(t, err) - _, err = provider.Get(context.Background(), model.DeploymentSpec{ + + // Update + component := model.ComponentSpec{ + Name: "alpine-test", + Type: "container", + Properties: map[string]interface{}{ + model.ContainerImage: "alpine:3.18", + }, + } + deployment := model.DeploymentSpec{ + Solution: model.SolutionSpec{ + Components: []model.ComponentSpec{component}, + }, + } + step := model.DeploymentStep{ + Components: []model.ComponentStep{ + { + Action: "update", + Component: component, + }, + }, + } + _, err = provider.Apply(context.Background(), deployment, step, false) + assert.Nil(t, err) + + // Get + components, err := provider.Get(context.Background(), model.DeploymentSpec{ Solution: model.SolutionSpec{ Components: []model.ComponentSpec{ { - Name: "redis-test", + Name: "alpine-test", Type: "container", Properties: map[string]interface{}{ - model.ContainerImage: "redis:latest", + model.ContainerImage: "alpine:3.18", }, }, }, @@ -167,29 +197,44 @@ func TestGet(t *testing.T) { { Action: "update", Component: model.ComponentSpec{ - Name: "redis-test", + Name: "alpine-test", Type: "container", Properties: map[string]interface{}{ - model.ContainerImage: "redis:latest", - "env.REDIS_VERSION": "7.0.12", // NOTE: Only environment variables passed in by the reference are returned. + model.ContainerImage: "alpine:3.18", }, }, }, }) assert.Nil(t, err) + assert.Equal(t, 1, len(components)) + + // Delete + step = model.DeploymentStep{ + Components: []model.ComponentStep{ + { + Action: "delete", + Component: component, + }, + }, + } + _, err = provider.Apply(context.Background(), deployment, step, false) + assert.Nil(t, err) } -func TestApply(t *testing.T) { +func TestApplyFailed(t *testing.T) { + testDockerProvider := os.Getenv("TEST_DOCKER_ENABLED") + if testDockerProvider == "" { + t.Skip("Skipping because TEST_DOCKER_PROVIDER enviornment variable is not set") + } config := DockerTargetProviderConfig{} provider := DockerTargetProvider{} err := provider.Init(config) assert.Nil(t, err) + + // invalid container image name component := model.ComponentSpec{ - Name: "redis-test", + Name: "", Type: "container", - Properties: map[string]interface{}{ - model.ContainerImage: "redis:latest", - }, } deployment := model.DeploymentSpec{ Solution: model.SolutionSpec{ @@ -204,18 +249,70 @@ func TestApply(t *testing.T) { }, }, } + _, err = provider.Apply(context.Background(), deployment, step, false) assert.NotNil(t, err) + // unknown container image + component = model.ComponentSpec{ + Name: "abcd:latest", + Type: "container", + Properties: map[string]interface{}{ + model.ContainerImage: "abc:latest", + }, + } + deployment = model.DeploymentSpec{ + Solution: model.SolutionSpec{ + Components: []model.ComponentSpec{component}, + }, + } step = model.DeploymentStep{ Components: []model.ComponentStep{ { - Action: "delete", + Action: "update", Component: component, }, }, } _, err = provider.Apply(context.Background(), deployment, step, false) + assert.NotNil(t, err) +} + +func TestApplyAlreadyRunning(t *testing.T) { + testDockerProvider := os.Getenv("TEST_DOCKER_ENABLED") + if testDockerProvider == "" { + t.Skip("Skipping because TEST_DOCKER_PROVIDER enviornment variable is not set") + } + config := DockerTargetProviderConfig{} + provider := DockerTargetProvider{} + err := provider.Init(config) + assert.Nil(t, err) + + component := model.ComponentSpec{ + Name: "alpine-test", + Type: "container", + Properties: map[string]interface{}{ + model.ContainerImage: "alpine:3.18", + }, + } + deployment := model.DeploymentSpec{ + Solution: model.SolutionSpec{ + Components: []model.ComponentSpec{component}, + }, + } + step := model.DeploymentStep{ + Components: []model.ComponentStep{ + { + Action: "update", + Component: component, + }, + }, + } + _, err = provider.Apply(context.Background(), deployment, step, false) + assert.Nil(t, err) + + // already running + _, err = provider.Apply(context.Background(), deployment, step, false) assert.Nil(t, err) }