k8s.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. // Copyright 2019 Yunion
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package handler
  15. import (
  16. "context"
  17. "fmt"
  18. "net/http"
  19. "path"
  20. "yunion.io/x/jsonutils"
  21. "yunion.io/x/pkg/appctx"
  22. "yunion.io/x/onecloud/pkg/appsrv"
  23. "yunion.io/x/onecloud/pkg/httperrors"
  24. "yunion.io/x/onecloud/pkg/mcclient"
  25. "yunion.io/x/onecloud/pkg/mcclient/auth"
  26. "yunion.io/x/onecloud/pkg/mcclient/modules/k8s"
  27. )
  28. type K8sResourceHandler struct {
  29. prefix string
  30. }
  31. type k8sResourceEnv struct {
  32. session *mcclient.ClientSession
  33. cluster string
  34. namespace string
  35. kind string
  36. name string
  37. }
  38. func NewK8sResourceHandler(prefix string) *K8sResourceHandler {
  39. return &K8sResourceHandler{
  40. prefix: prefix,
  41. }
  42. }
  43. func (h *K8sResourceHandler) Bind(app *appsrv.Application) {
  44. app.AddHandler(GET, h.instancePrefix(""), FetchAuthToken(h.Get))
  45. app.AddHandler(GET, h.instancePrefix("yaml"), FetchAuthToken(h.GetYAML))
  46. app.AddHandler(PUT, h.instancePrefix(""), FetchAuthToken(h.Put))
  47. app.AddHandler(DELETE, h.instancePrefix(""), FetchAuthToken(h.Delete))
  48. }
  49. func (h *K8sResourceHandler) instancePrefix(segs ...string) string {
  50. url := fmt.Sprintf("%s/<kind>/<name>", h.prefix)
  51. if len(segs) == 0 {
  52. return url
  53. }
  54. newSegs := []string{url}
  55. newSegs = append(newSegs, segs...)
  56. return path.Join(newSegs...)
  57. }
  58. func (h *K8sResourceHandler) fetchEnv(ctx context.Context, req *http.Request) (*k8sResourceEnv, error) {
  59. pathParams := appctx.AppContextParams(ctx)
  60. kind := pathParams["<kind>"]
  61. resName := pathParams["<name>"]
  62. params, err := jsonutils.ParseQueryString(req.URL.RawQuery)
  63. if err != nil {
  64. return nil, httperrors.NewInputParameterError("Parse query: %v", err)
  65. }
  66. namespace, _ := params.GetString("namespace")
  67. cluster, _ := params.GetString("cluster")
  68. token := AppContextToken(ctx)
  69. s := auth.GetSession(ctx, token, FetchRegion(req))
  70. return &k8sResourceEnv{
  71. session: s,
  72. cluster: cluster,
  73. namespace: namespace,
  74. kind: kind,
  75. name: resName,
  76. }, nil
  77. }
  78. func (h *K8sResourceHandler) Get(ctx context.Context, w http.ResponseWriter, req *http.Request) {
  79. env, err := h.fetchEnv(ctx, req)
  80. if err != nil {
  81. httperrors.GeneralServerError(ctx, w, err)
  82. return
  83. }
  84. detail, err := k8s.RawResource.Get(env.session, env.kind, env.namespace, env.name, env.cluster)
  85. if err != nil {
  86. httperrors.GeneralServerError(ctx, w, err)
  87. return
  88. }
  89. appsrv.SendJSON(w, detail)
  90. }
  91. func (h *K8sResourceHandler) GetYAML(ctx context.Context, w http.ResponseWriter, req *http.Request) {
  92. env, err := h.fetchEnv(ctx, req)
  93. if err != nil {
  94. httperrors.GeneralServerError(ctx, w, err)
  95. return
  96. }
  97. detail, err := k8s.RawResource.GetYAML(env.session, env.kind, env.namespace, env.name, env.cluster)
  98. if err != nil {
  99. httperrors.GeneralServerError(ctx, w, err)
  100. return
  101. }
  102. appsrv.Send(w, string(detail))
  103. }
  104. func (h *K8sResourceHandler) Put(ctx context.Context, w http.ResponseWriter, req *http.Request) {
  105. env, err := h.fetchEnv(ctx, req)
  106. if err != nil {
  107. httperrors.GeneralServerError(ctx, w, err)
  108. return
  109. }
  110. data, err := appsrv.FetchJSON(req)
  111. if err != nil {
  112. httperrors.GeneralServerError(ctx, w, err)
  113. return
  114. }
  115. err = k8s.RawResource.Put(env.session, env.kind, env.namespace, env.name, data, env.cluster)
  116. if err != nil {
  117. httperrors.GeneralServerError(ctx, w, err)
  118. return
  119. }
  120. w.WriteHeader(http.StatusCreated)
  121. }
  122. func (h *K8sResourceHandler) Delete(ctx context.Context, w http.ResponseWriter, req *http.Request) {
  123. env, err := h.fetchEnv(ctx, req)
  124. if err != nil {
  125. httperrors.GeneralServerError(ctx, w, err)
  126. return
  127. }
  128. if err := k8s.RawResource.Delete(env.session, env.kind, env.namespace, env.name, env.cluster); err != nil {
  129. httperrors.GeneralServerError(ctx, w, err)
  130. return
  131. }
  132. w.WriteHeader(http.StatusOK)
  133. }