package console
import (
"encoding/json"
"io"
"net/http"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)
var _ = Describe("ConfigMap 资源接口测试", Label("with-workload-cluster"), func() {
Context("ConfigMap 创建", func() {
It("创建成功", func() {
resp, err := createConfigMap("test-configmap-success", "default")
Expect(err).NotTo(HaveOccurred())
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
Expect(err).NotTo(HaveOccurred())
Expect(resp.StatusCode).To(Equal(http.StatusCreated), string(body))
defer func() {
_, err := makeRequest("DELETE", "/api/v1/namespaces/default/configmaps/test-configmap-success", nil)
Expect(err).NotTo(HaveOccurred())
}()
})
It("创建失败 - 字段有误", func() {
configMapYAML := map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
"metadata": map[string]interface{}{
"name": "test-configmap-invalid-key",
"namespace": "default",
},
"data": map[string]interface{}{
"key with spaces": "value",
},
}
resp, err := makeRequest("POST", "/api/v1/namespaces/default/configmaps", configMapYAML)
Expect(err).NotTo(HaveOccurred())
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
Expect(err).NotTo(HaveOccurred())
Expect(resp.StatusCode).To(Equal(http.StatusUnprocessableEntity), string(body))
Expect(err).NotTo(HaveOccurred())
})
It("创建失败 - 已存在同名", func() {
resp1, err := createConfigMap("test-existing-configmap", "default")
Expect(err).NotTo(HaveOccurred())
defer resp1.Body.Close()
Expect(resp1.StatusCode).To(Equal(http.StatusCreated))
defer func() {
_, err := makeRequest("DELETE", "/api/v1/namespaces/default/configmaps/test-existing-configmap", nil)
Expect(err).NotTo(HaveOccurred())
}()
resp2, err := createConfigMap("test-existing-configmap", "default")
Expect(err).NotTo(HaveOccurred())
defer resp2.Body.Close()
body, err := io.ReadAll(resp2.Body)
Expect(err).NotTo(HaveOccurred())
Expect(resp2.StatusCode).To(Equal(http.StatusConflict), string(body))
})
It("创建失败 - Namespace 不存在", func() {
resp, err := createConfigMap("test-configmap-nonexistent-ns", "nonexistent-namespace")
Expect(err).NotTo(HaveOccurred())
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
Expect(err).NotTo(HaveOccurred())
Expect(resp.StatusCode).To(Equal(http.StatusNotFound), string(body))
})
})
Context("ConfigMap 查询", func() {
It("查询成功", func() {
_, err := createConfigMap("test-configmap-query", "default")
Expect(err).NotTo(HaveOccurred())
defer func() {
_, err := makeRequest("DELETE", "/api/v1/namespaces/default/configmaps/test-configmap-query", nil)
Expect(err).NotTo(HaveOccurred())
}()
resp, err := makeRequest("GET", "/api/v1/namespaces/default/configmaps/test-configmap-query", nil)
Expect(err).NotTo(HaveOccurred())
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
Expect(err).NotTo(HaveOccurred())
Expect(resp.StatusCode).To(Equal(http.StatusOK), string(body))
var configMap map[string]interface{}
err = json.Unmarshal(body, &configMap)
Expect(err).NotTo(HaveOccurred())
Expect(configMap["metadata"].(map[string]interface{})["name"]).To(Equal("test-configmap-query"))
})
})
Context("ConfigMap 修改", func() {
It("修改成功", func() {
_, err := createConfigMap("test-configmap-update-success", "default")
Expect(err).NotTo(HaveOccurred())
defer func() {
_, err := makeRequest("DELETE", "/api/v1/namespaces/default/configmaps/test-configmap-update-success", nil)
Expect(err).NotTo(HaveOccurred())
}()
patch := createPatch("test-configmap-update-success", "default")
resp, err := makeRequest("PATCH", "/api/v1/namespaces/default/configmaps/test-configmap-update-success", patch)
Expect(err).NotTo(HaveOccurred())
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
Expect(err).NotTo(HaveOccurred())
Expect(resp.StatusCode).To(Equal(http.StatusOK), string(body))
})
It("修改失败 - 字段有误", func() {
_, err := createConfigMap("test-configmap-field-error", "default")
Expect(err).NotTo(HaveOccurred())
defer func() {
_, err := makeRequest("DELETE", "/api/v1/namespaces/default/configmaps/test-configmap-field-error", nil)
Expect(err).NotTo(HaveOccurred())
}()
patch := createMalformedPatch("test-configmap-field-error", "default")
resp, err := makeRequest("PATCH", "/api/v1/namespaces/default/configmaps/test-configmap-field-error", patch)
Expect(err).NotTo(HaveOccurred())
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
Expect(err).NotTo(HaveOccurred())
Expect(resp.StatusCode).To(Equal(http.StatusUnprocessableEntity), string(body))
})
It("修改同一命名空间其他同类资源", func() {
_, err := createConfigMap("test-configmap-other-resource", "default")
Expect(err).NotTo(HaveOccurred())
_, err = createConfigMap("other-configmap", "default")
Expect(err).NotTo(HaveOccurred())
defer func() {
_, err = makeRequest("DELETE", "/api/v1/namespaces/default/configmaps/test-configmap-other-resource", nil)
Expect(err).NotTo(HaveOccurred())
_, err := makeRequest("DELETE", "/api/v1/namespaces/default/configmaps/other-configmap", nil)
Expect(err).NotTo(HaveOccurred())
}()
patch := createPatch("other-configmap", "default")
resp, err := makeRequest("PATCH", "/api/v1/namespaces/default/configmaps/test-configmap-other-resource", patch)
Expect(err).NotTo(HaveOccurred())
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
Expect(err).NotTo(HaveOccurred())
Expect(resp.StatusCode).To(Equal(http.StatusBadRequest), string(body))
})
It("修改不存在的Namespace", func() {
_, err := createConfigMap("test-configmap-nonexistent-ns", "default")
Expect(err).NotTo(HaveOccurred())
defer func() {
_, err := makeRequest("DELETE", "/api/v1/namespaces/default/configmaps/test-configmap-nonexistent-ns", nil)
Expect(err).NotTo(HaveOccurred())
}()
patch := createPatch("test-configmap-nonexistent-ns", "nonexistent-namespace")
resp, err := makeRequest("PATCH", "/api/v1/namespaces/default/configmaps/test-configmap-nonexistent-ns", patch)
Expect(err).NotTo(HaveOccurred())
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
Expect(err).NotTo(HaveOccurred())
Expect(resp.StatusCode).To(Equal(http.StatusBadRequest), string(body))
})
})
Context("ConfigMap 删除", func() {
It("删除成功", func() {
_, err := createConfigMap("test-configmap-delete", "default")
Expect(err).NotTo(HaveOccurred())
resp, err := makeRequest("DELETE", "/api/v1/namespaces/default/configmaps/test-configmap-delete", nil)
Expect(err).NotTo(HaveOccurred())
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
Expect(err).NotTo(HaveOccurred())
Expect(resp.StatusCode).To(Equal(http.StatusOK), string(body))
})
})
})
var _ = Describe("Secret 资源接口测试", Label("with-workload-cluster"), func() {
Context("Secret 创建", func() {
It("创建成功", func() {
resp, err := createSecret("test-secret-success", "default")
Expect(err).NotTo(HaveOccurred())
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
Expect(err).NotTo(HaveOccurred())
Expect(resp.StatusCode).To(Equal(http.StatusCreated), string(body))
defer func() {
_, err := makeRequest("DELETE", "/api/v1/namespaces/default/secrets/test-secret-success", nil)
Expect(err).NotTo(HaveOccurred())
}()
})
It("创建失败 - 字段有误", func() {
secretYAML := map[string]interface{}{
"apiVersion": "v1",
"kind": "Secret",
"metadata": map[string]interface{}{
"name": "test-secret-invalid-data",
"namespace": "default",
},
"type": "Opaque",
"data": map[string]interface{}{
"key with spaces": "",
},
}
resp, err := makeRequest("POST", "/api/v1/namespaces/default/secrets", secretYAML)
Expect(err).NotTo(HaveOccurred())
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
Expect(err).NotTo(HaveOccurred())
Expect(resp.StatusCode).To(Equal(http.StatusUnprocessableEntity), string(body))
})
It("创建失败 - 已存在同名", func() {
resp1, err := createSecret("test-existing-secret", "default")
Expect(err).NotTo(HaveOccurred())
defer resp1.Body.Close()
Expect(resp1.StatusCode).To(Equal(http.StatusCreated))
defer func() {
_, err := makeRequest("DELETE", "/api/v1/namespaces/default/secrets/test-existing-secret", nil)
Expect(err).NotTo(HaveOccurred())
}()
resp2, err := createSecret("test-existing-secret", "default")
Expect(err).NotTo(HaveOccurred())
defer resp2.Body.Close()
body, err := io.ReadAll(resp2.Body)
Expect(err).NotTo(HaveOccurred())
Expect(resp2.StatusCode).To(Equal(http.StatusConflict), string(body))
})
It("创建失败 - Namespace 不存在", func() {
secretYAML := map[string]interface{}{
"apiVersion": "v1",
"kind": "Secret",
"metadata": map[string]interface{}{
"name": "test-secret-nonexistent-ns",
"namespace": "nonexistent-namespace",
},
"type": "Opaque",
"data": map[string]interface{}{
"key1": "dmFsdWUx",
},
}
resp, err := makeRequest("POST", "/api/v1/namespaces/nonexistent-namespace/secrets", secretYAML)
Expect(err).NotTo(HaveOccurred())
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
Expect(err).NotTo(HaveOccurred())
Expect(resp.StatusCode).To(Equal(http.StatusNotFound), string(body))
})
})
Context("Secret 查询", func() {
It("查询成功", func() {
_, err := createSecret("test-secret-query", "default")
Expect(err).NotTo(HaveOccurred())
defer func() {
_, err := makeRequest("DELETE", "/api/v1/namespaces/default/secrets/test-secret-query", nil)
Expect(err).NotTo(HaveOccurred())
}()
resp, err := makeRequest("GET", "/api/v1/namespaces/default/secrets/test-secret-query", nil)
Expect(err).NotTo(HaveOccurred())
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
Expect(err).NotTo(HaveOccurred())
Expect(resp.StatusCode).To(Equal(http.StatusOK), string(body))
})
})
Context("Secret 修改", func() {
It("修改成功", func() {
_, err := createSecret("test-secret-update-success", "default")
Expect(err).NotTo(HaveOccurred())
defer func() {
_, err := makeRequest("DELETE", "/api/v1/namespaces/default/secrets/test-secret-update-success", nil)
Expect(err).NotTo(HaveOccurred())
}()
patch := createPatch("test-secret-update-success", "default")
resp, err := makeRequest("PATCH", "/api/v1/namespaces/default/secrets/test-secret-update-success", patch)
Expect(err).NotTo(HaveOccurred())
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
Expect(err).NotTo(HaveOccurred())
Expect(resp.StatusCode).To(Equal(http.StatusOK), string(body))
})
It("修改失败 - 字段有误", func() {
_, err := createSecret("test-secret-field-error", "default")
Expect(err).NotTo(HaveOccurred())
defer func() {
_, err := makeRequest("DELETE", "/api/v1/namespaces/default/secrets/test-secret-field-error", nil)
Expect(err).NotTo(HaveOccurred())
}()
patch := createMalformedPatch("test-secret-field-error", "default")
resp, err := makeRequest("PATCH", "/api/v1/namespaces/default/secrets/test-secret-field-error", patch)
Expect(err).NotTo(HaveOccurred())
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
Expect(err).NotTo(HaveOccurred())
Expect(resp.StatusCode).To(Equal(http.StatusUnprocessableEntity), string(body))
})
It("修改同一命名空间其他同类资源", func() {
_, err := createSecret("test-secret-other-resource", "default")
Expect(err).NotTo(HaveOccurred())
_, err = createSecret("other-secret", "default")
Expect(err).NotTo(HaveOccurred())
defer func() {
_, err = makeRequest("DELETE", "/api/v1/namespaces/default/secrets/test-secret-other-resource", nil)
Expect(err).NotTo(HaveOccurred())
_, err = makeRequest("DELETE", "/api/v1/namespaces/default/secrets/other-secret", nil)
Expect(err).NotTo(HaveOccurred())
}()
patch := createPatch("other-secret", "default")
resp, err := makeRequest("PATCH", "/api/v1/namespaces/default/secrets/test-secret-other-resource", patch)
Expect(err).NotTo(HaveOccurred())
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
Expect(err).NotTo(HaveOccurred())
Expect(resp.StatusCode).To(Equal(http.StatusBadRequest), string(body))
})
It("修改不存在的Namespace", func() {
_, err := createSecret("test-secret-field-error", "default")
Expect(err).NotTo(HaveOccurred())
defer func() {
_, err := makeRequest("DELETE", "/api/v1/namespaces/default/secrets/test-secret-field-error", nil)
Expect(err).NotTo(HaveOccurred())
}()
patch := createPatch("test-secret-field-error", "nonexistent-namespace")
resp, err := makeRequest("PATCH", "/api/v1/namespaces/default/secrets/test-secret-field-error", patch)
Expect(err).NotTo(HaveOccurred())
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
Expect(err).NotTo(HaveOccurred())
Expect(resp.StatusCode).To(Equal(http.StatusBadRequest), string(body))
})
})
Context("Secret 删除", func() {
It("删除成功", func() {
_, err := createSecret("test-secret-delete", "default")
Expect(err).NotTo(HaveOccurred())
resp, err := makeRequest("DELETE", "/api/v1/namespaces/default/secrets/test-secret-delete", nil)
Expect(err).NotTo(HaveOccurred())
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
Expect(err).NotTo(HaveOccurred())
Expect(resp.StatusCode).To(Equal(http.StatusOK), string(body))
})
})
})