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 5.7 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/pkg/errors"
  6. corev1 "gitlink.org.cn/JCCE/PCM/adaptor/pod/server/kubernetes/api/core/v1"
  7. "gitlink.org.cn/JCCE/PCM/adaptor/pod/server/kubernetes/client-go/kubernetes"
  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-hwk8s",
  54. Namespace: "pcm",
  55. Labels: map[string]string{"name": "test_api"},
  56. },
  57. Spec: corev1.PodSpec{
  58. ProviderId: 1,
  59. //ali:cn-hangzhou tc:ap-guangzhou hw: cn-east-3
  60. RegionId: "ap-guangzhou",
  61. RestartPolicy: corev1.RestartPolicyAlways,
  62. Containers: []corev1.Container{
  63. {
  64. Name: "sdk-hwk8s-container",
  65. Image: "library/nginx:stable-alpine-perl",
  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-test",
  97. Namespace: "pcm",
  98. Labels: map[string]string{"name": "test_api222"},
  99. },
  100. Spec: corev1.PodSpec{
  101. RestartPolicy: corev1.RestartPolicyAlways,
  102. Containers: []corev1.Container{
  103. {
  104. Name: "pcm-sdk-huawei-container2",
  105. Image: "nginx:latest",
  106. Resources: corev1.ResourceRequirements{
  107. Limits: map[corev1.ResourceName]resource.Quantity{
  108. corev1.ResourceCPU: resource.MustParse("500m"),
  109. corev1.ResourceMemory: resource.MustParse("1Gi"),
  110. },
  111. },
  112. },
  113. },
  114. },
  115. Status: corev1.PodStatus{},
  116. }
  117. client.CoreV1().Pods("pcm").Update(context.TODO(), &pod, metav1.UpdateOptions{})
  118. return nil
  119. }
  120. // DeletePod 删除Pod
  121. func DeletePod(client *kubernetes.Clientset) error {
  122. return client.CoreV1().Pods("pcm").Delete(context.TODO(), "podName", metav1.DeleteOptions{})
  123. }
  124. // ListPod 查询Pod
  125. func ListPod(client *kubernetes.Clientset) (*corev1.PodList, error) {
  126. podList, _ := client.CoreV1().Pods("pcm").List(context.TODO(), metav1.ListOptions{})
  127. println(podList.Items[0].Name)
  128. return podList, nil
  129. }
  130. func main() {
  131. // 有多种认证方式,具体请参考
  132. //《使用cci-iam-authenticator进行认证并创建client》,https://support.huaweicloud.com/sdkreference-cci/cci_09_0004.html
  133. cciConfig, err := clientcmd.BuildConfigFromFlags(cciEndpoint, "")
  134. var optionArgs []string
  135. optionArgs = append(optionArgs, fmt.Sprintf("--iam-endpoint=%s", iamEndpoint))
  136. optionArgs = append(optionArgs, fmt.Sprintf("--project-name=%s", projectName))
  137. optionArgs = append(optionArgs, fmt.Sprintf("--ak=%s", ak))
  138. optionArgs = append(optionArgs, fmt.Sprintf("--sk=%s", sk))
  139. cciConfig.ExecProvider = &api.ExecConfig{
  140. Command: "cci-iam-authenticator",
  141. APIVersion: apiVersion,
  142. Args: append([]string{"token"}, optionArgs...),
  143. Env: make([]api.ExecEnvVar, 0),
  144. }
  145. cs, err := kubernetes.NewForConfig(cciConfig)
  146. fmt.Println("start to create Pod")
  147. _, err = CreatePod(cs)
  148. if err != nil {
  149. panic(err)
  150. }
  151. fmt.Println("Pod created")
  152. //
  153. //fmt.Println("start to get Pod details")
  154. //_, err = ListPod(cs)
  155. //if err != nil {
  156. // panic(err)
  157. //}
  158. //fmt.Println("Pod details got")
  159. //
  160. //fmt.Println("start to update Pod")
  161. //err = UpdatePod(cs)
  162. //if err != nil {
  163. // panic(err)
  164. //}
  165. //fmt.Println("Pod updated")
  166. //
  167. //fmt.Println("start to delete Pod")
  168. //err = DeletePod(cs)
  169. //if err != nil {
  170. // panic(err)
  171. //}
  172. //fmt.Println("Pod deleted")
  173. }

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.