You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

pcm_huawei.go 6.0 kB

3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package main
  2. import (
  3. corev1 "code.gitlink.org.cn/JCCE/PCM.git/adaptor/pod/server/kubernetes/api/core/v1"
  4. "code.gitlink.org.cn/JCCE/PCM.git/adaptor/pod/server/kubernetes/client-go/kubernetes"
  5. "context"
  6. "fmt"
  7. "github.com/pkg/errors"
  8. "k8s.io/apimachinery/pkg/api/resource"
  9. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  10. "k8s.io/client-go/tools/clientcmd"
  11. "k8s.io/client-go/tools/clientcmd/api"
  12. )
  13. const (
  14. apiVersion = "client.authentication.k8s.io/v1beta1"
  15. // 云容器实例 CCI,参考https://developer.huaweicloud.com/endpoint
  16. cciEndpoint = "https://cci.cn-east-3.myhuaweicloud.com"
  17. // 统一身份认证服务 IAM,参考https://developer.huaweicloud.com/endpoint
  18. iamEndpoint = "https://iam.cn-east-3.myhuaweicloud.com"
  19. // 地区和终端节点,参考https://developer.huaweicloud.com/endpoint
  20. projectName = "cn-east-3"
  21. // 获取AK/SK参考: https://support.huaweicloud.com/devg-cci/cci_kubectl_01.html#cci_kubectl_01__section17023744719
  22. ak = "ATQTIWUT9K66VRMMXKVY"
  23. sk = "Wa0aixDVuhZOfDZGWvgIJQBHnyiDlGdgDn1Ai5Yy"
  24. )
  25. // NewClient 通过AK/SK认证创建Clientset
  26. func NewClient() (*kubernetes.Clientset, error) {
  27. config, err := clientcmd.BuildConfigFromFlags(cciEndpoint, "")
  28. if err != nil {
  29. return nil, err
  30. }
  31. var optionArgs []string
  32. optionArgs = append(optionArgs, fmt.Sprintf("--iam-endpoint=%s", iamEndpoint))
  33. optionArgs = append(optionArgs, fmt.Sprintf("--project-name=%s", projectName))
  34. optionArgs = append(optionArgs, fmt.Sprintf("--token-only=false"))
  35. optionArgs = append(optionArgs, fmt.Sprintf("--ak=%s", ak))
  36. optionArgs = append(optionArgs, fmt.Sprintf("--sk=%s", sk))
  37. config.ExecProvider = &api.ExecConfig{
  38. Command: "cci-iam-authenticator",
  39. APIVersion: apiVersion,
  40. Args: append([]string{"token"}, optionArgs...),
  41. Env: make([]api.ExecEnvVar, 0),
  42. }
  43. return kubernetes.NewForConfig(config)
  44. }
  45. func CreatePod(client *kubernetes.Clientset) (*corev1.Pod, error) {
  46. cli, _ := NewClient()
  47. pod := corev1.Pod{
  48. TypeMeta: metav1.TypeMeta{
  49. APIVersion: "core/V1",
  50. Kind: "Pod",
  51. },
  52. ObjectMeta: metav1.ObjectMeta{
  53. Name: "hw-sdk-hwk8s01",
  54. Namespace: "pcm",
  55. Labels: map[string]string{"name": "test_api"},
  56. },
  57. Spec: corev1.PodSpec{
  58. ProviderId: 0,
  59. //ali:cn-hangzhou tc:ap-guangzhou hw: cn-east-3
  60. RegionId: "cn-hangzhou",
  61. RestartPolicy: corev1.RestartPolicyAlways,
  62. Containers: []corev1.Container{
  63. {
  64. Name: "sdk-hwk8s01-container",
  65. Image: "registry-vpc.cn-hangzhou.aliyuncs.com/eci_open/alpine:3.5",
  66. Resources: corev1.ResourceRequirements{
  67. Limits: map[corev1.ResourceName]resource.Quantity{
  68. corev1.ResourceCPU: resource.MustParse("1000m"),
  69. corev1.ResourceMemory: resource.MustParse("2Gi"),
  70. },
  71. },
  72. },
  73. },
  74. },
  75. Status: corev1.PodStatus{},
  76. }
  77. resp, err := cli.CoreV1().Pods("pcm").Create(context.TODO(), &pod, metav1.CreateOptions{})
  78. if err != nil {
  79. return nil, errors.Wrap(err, "Huaweiyun CreatePod error")
  80. }
  81. return &corev1.Pod{
  82. TypeMeta: resp.TypeMeta,
  83. ObjectMeta: resp.ObjectMeta,
  84. Spec: resp.Spec,
  85. Status: resp.Status,
  86. }, nil
  87. }
  88. // UpdatePod 更新Pod
  89. func UpdatePod(client *kubernetes.Clientset) error {
  90. pod := corev1.Pod{
  91. TypeMeta: metav1.TypeMeta{
  92. APIVersion: "core/V1",
  93. Kind: "Pod",
  94. },
  95. ObjectMeta: metav1.ObjectMeta{
  96. Name: "hw-sdk-test002",
  97. Namespace: "pcm",
  98. UID: "eci-bp123wba1qv9xymntd24",
  99. Labels: map[string]string{"name": "test_api222"},
  100. },
  101. Spec: corev1.PodSpec{
  102. ProviderId: 0,
  103. //ali:cn-hangzhou tc:ap-guangzhou hw: cn-east-3
  104. RegionId: "cn-hangzhou",
  105. RestartPolicy: corev1.RestartPolicyAlways,
  106. Containers: []corev1.Container{
  107. {
  108. Name: "pcm-sdk-huawei-contai",
  109. Image: "nginx:latest",
  110. Resources: corev1.ResourceRequirements{
  111. Limits: map[corev1.ResourceName]resource.Quantity{
  112. corev1.ResourceCPU: resource.MustParse("2000m"),
  113. corev1.ResourceMemory: resource.MustParse("1Gi"),
  114. },
  115. },
  116. },
  117. },
  118. },
  119. Status: corev1.PodStatus{},
  120. }
  121. client.CoreV1().Pods("pcm").Update(context.TODO(), &pod, metav1.UpdateOptions{})
  122. return nil
  123. }
  124. // DeletePod 删除Pod
  125. func DeletePod(client *kubernetes.Clientset) error {
  126. return client.CoreV1().Pods("pcm").Delete(context.TODO(), "podName", metav1.DeleteOptions{})
  127. }
  128. // ListPod 查询Pod
  129. func ListPod(client *kubernetes.Clientset) (*corev1.PodList, error) {
  130. pod := corev1.Pod{
  131. Spec: corev1.PodSpec{
  132. ProviderId: 0,
  133. //ali:cn-hangzhou tc:ap-guangzhou hw: cn-east-3
  134. //RegionId: "ap-guangzhou",
  135. },
  136. }
  137. podList, _ := client.CoreV1().Pods("pcm").List(context.TODO(), &pod, metav1.ListOptions{})
  138. return podList, nil
  139. }
  140. func main() {
  141. // 有多种认证方式,具体请参考
  142. //《使用cci-iam-authenticator进行认证并创建client》,https://support.huaweicloud.com/sdkreference-cci/cci_09_0004.html
  143. cciConfig, err := clientcmd.BuildConfigFromFlags(cciEndpoint, "")
  144. var optionArgs []string
  145. optionArgs = append(optionArgs, fmt.Sprintf("--iam-endpoint=%s", iamEndpoint))
  146. optionArgs = append(optionArgs, fmt.Sprintf("--project-name=%s", projectName))
  147. optionArgs = append(optionArgs, fmt.Sprintf("--ak=%s", ak))
  148. optionArgs = append(optionArgs, fmt.Sprintf("--sk=%s", sk))
  149. cciConfig.ExecProvider = &api.ExecConfig{
  150. Command: "cci-iam-authenticator",
  151. APIVersion: apiVersion,
  152. Args: append([]string{"token"}, optionArgs...),
  153. Env: make([]api.ExecEnvVar, 0),
  154. }
  155. cs, err := kubernetes.NewForConfig(cciConfig)
  156. //fmt.Println("start to create Pod")
  157. //_, err = CreatePod(cs)
  158. //if err != nil {
  159. // panic(err)
  160. //}
  161. //fmt.Println("Pod created")
  162. //fmt.Println("start to get Pod details")
  163. //_, err = ListPod(cs)
  164. //if err != nil {
  165. // panic(err)
  166. //}
  167. //fmt.Println("Pod details got")
  168. fmt.Println("start to update Pod")
  169. err = UpdatePod(cs)
  170. if err != nil {
  171. panic(err)
  172. }
  173. fmt.Println("Pod updated")
  174. //
  175. //fmt.Println("start to delete Pod")
  176. //err = DeletePod(cs)
  177. //if err != nil {
  178. // panic(err)
  179. //}
  180. //fmt.Println("Pod deleted")
  181. }

PCM is positioned as Software stack over Cloud, aiming to build the standards and ecology of heterogeneous cloud collaboration for JCC in a non intrusive and autonomous peer-to-peer manner.