PageRenderTime 42ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/vendor/github.com/vmware/govmomi/session/manager.go

https://gitlab.com/unofficial-mirrors/kubernetes
Go | 267 lines | 189 code | 48 blank | 30 comment | 34 complexity | 518308ea0d024af384b5bdbd9daa1f9b MD5 | raw file
  1. /*
  2. Copyright (c) 2015 VMware, Inc. All Rights Reserved.
  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. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package session
  14. import (
  15. "context"
  16. "net/http"
  17. "net/url"
  18. "os"
  19. "github.com/vmware/govmomi/property"
  20. "github.com/vmware/govmomi/vim25"
  21. "github.com/vmware/govmomi/vim25/methods"
  22. "github.com/vmware/govmomi/vim25/mo"
  23. "github.com/vmware/govmomi/vim25/types"
  24. )
  25. // Locale defaults to "en_US" and can be overridden via this var or the GOVMOMI_LOCALE env var.
  26. // A value of "_" uses the server locale setting.
  27. var Locale = os.Getenv("GOVMOMI_LOCALE")
  28. func init() {
  29. if Locale == "_" {
  30. Locale = ""
  31. } else if Locale == "" {
  32. Locale = "en_US"
  33. }
  34. }
  35. type Manager struct {
  36. client *vim25.Client
  37. userSession *types.UserSession
  38. }
  39. func NewManager(client *vim25.Client) *Manager {
  40. m := Manager{
  41. client: client,
  42. }
  43. return &m
  44. }
  45. func (sm Manager) Reference() types.ManagedObjectReference {
  46. return *sm.client.ServiceContent.SessionManager
  47. }
  48. func (sm *Manager) SetLocale(ctx context.Context, locale string) error {
  49. req := types.SetLocale{
  50. This: sm.Reference(),
  51. Locale: locale,
  52. }
  53. _, err := methods.SetLocale(ctx, sm.client, &req)
  54. return err
  55. }
  56. func (sm *Manager) Login(ctx context.Context, u *url.Userinfo) error {
  57. req := types.Login{
  58. This: sm.Reference(),
  59. Locale: Locale,
  60. }
  61. if u != nil {
  62. req.UserName = u.Username()
  63. if pw, ok := u.Password(); ok {
  64. req.Password = pw
  65. }
  66. }
  67. login, err := methods.Login(ctx, sm.client, &req)
  68. if err != nil {
  69. return err
  70. }
  71. sm.userSession = &login.Returnval
  72. return nil
  73. }
  74. // LoginExtensionByCertificate uses the vCenter SDK tunnel to login using a client certificate.
  75. // The client certificate can be set using the soap.Client.SetCertificate method.
  76. // See: https://kb.vmware.com/s/article/2004305
  77. func (sm *Manager) LoginExtensionByCertificate(ctx context.Context, key string) error {
  78. c := sm.client
  79. u := c.URL()
  80. if u.Hostname() != "sdkTunnel" {
  81. sc := c.Tunnel()
  82. c = &vim25.Client{
  83. Client: sc,
  84. RoundTripper: sc,
  85. ServiceContent: c.ServiceContent,
  86. }
  87. // When http.Transport.Proxy is used, our thumbprint checker is bypassed, resulting in:
  88. // "Post https://sdkTunnel:8089/sdk: x509: certificate is valid for $vcenter_hostname, not sdkTunnel"
  89. // The only easy way around this is to disable verification for the call to LoginExtensionByCertificate().
  90. // TODO: find a way to avoid disabling InsecureSkipVerify.
  91. c.Transport.(*http.Transport).TLSClientConfig.InsecureSkipVerify = true
  92. }
  93. req := types.LoginExtensionByCertificate{
  94. This: sm.Reference(),
  95. ExtensionKey: key,
  96. Locale: Locale,
  97. }
  98. login, err := methods.LoginExtensionByCertificate(ctx, c, &req)
  99. if err != nil {
  100. return err
  101. }
  102. // Copy the session cookie
  103. sm.client.Jar.SetCookies(u, c.Jar.Cookies(c.URL()))
  104. sm.userSession = &login.Returnval
  105. return nil
  106. }
  107. func (sm *Manager) LoginByToken(ctx context.Context) error {
  108. req := types.LoginByToken{
  109. This: sm.Reference(),
  110. Locale: Locale,
  111. }
  112. login, err := methods.LoginByToken(ctx, sm.client, &req)
  113. if err != nil {
  114. return err
  115. }
  116. sm.userSession = &login.Returnval
  117. return nil
  118. }
  119. func (sm *Manager) Logout(ctx context.Context) error {
  120. req := types.Logout{
  121. This: sm.Reference(),
  122. }
  123. _, err := methods.Logout(ctx, sm.client, &req)
  124. if err != nil {
  125. return err
  126. }
  127. sm.userSession = nil
  128. return nil
  129. }
  130. // UserSession retrieves and returns the SessionManager's CurrentSession field.
  131. // Nil is returned if the session is not authenticated.
  132. func (sm *Manager) UserSession(ctx context.Context) (*types.UserSession, error) {
  133. var mgr mo.SessionManager
  134. pc := property.DefaultCollector(sm.client)
  135. err := pc.RetrieveOne(ctx, sm.Reference(), []string{"currentSession"}, &mgr)
  136. if err != nil {
  137. // It's OK if we can't retrieve properties because we're not authenticated
  138. if f, ok := err.(types.HasFault); ok {
  139. switch f.Fault().(type) {
  140. case *types.NotAuthenticated:
  141. return nil, nil
  142. }
  143. }
  144. return nil, err
  145. }
  146. return mgr.CurrentSession, nil
  147. }
  148. func (sm *Manager) TerminateSession(ctx context.Context, sessionId []string) error {
  149. req := types.TerminateSession{
  150. This: sm.Reference(),
  151. SessionId: sessionId,
  152. }
  153. _, err := methods.TerminateSession(ctx, sm.client, &req)
  154. return err
  155. }
  156. // SessionIsActive checks whether the session that was created at login is
  157. // still valid. This function only works against vCenter.
  158. func (sm *Manager) SessionIsActive(ctx context.Context) (bool, error) {
  159. if sm.userSession == nil {
  160. return false, nil
  161. }
  162. req := types.SessionIsActive{
  163. This: sm.Reference(),
  164. SessionID: sm.userSession.Key,
  165. UserName: sm.userSession.UserName,
  166. }
  167. active, err := methods.SessionIsActive(ctx, sm.client, &req)
  168. if err != nil {
  169. return false, err
  170. }
  171. return active.Returnval, err
  172. }
  173. func (sm *Manager) AcquireGenericServiceTicket(ctx context.Context, spec types.BaseSessionManagerServiceRequestSpec) (*types.SessionManagerGenericServiceTicket, error) {
  174. req := types.AcquireGenericServiceTicket{
  175. This: sm.Reference(),
  176. Spec: spec,
  177. }
  178. res, err := methods.AcquireGenericServiceTicket(ctx, sm.client, &req)
  179. if err != nil {
  180. return nil, err
  181. }
  182. return &res.Returnval, nil
  183. }
  184. func (sm *Manager) AcquireLocalTicket(ctx context.Context, userName string) (*types.SessionManagerLocalTicket, error) {
  185. req := types.AcquireLocalTicket{
  186. This: sm.Reference(),
  187. UserName: userName,
  188. }
  189. res, err := methods.AcquireLocalTicket(ctx, sm.client, &req)
  190. if err != nil {
  191. return nil, err
  192. }
  193. return &res.Returnval, nil
  194. }
  195. func (sm *Manager) AcquireCloneTicket(ctx context.Context) (string, error) {
  196. req := types.AcquireCloneTicket{
  197. This: sm.Reference(),
  198. }
  199. res, err := methods.AcquireCloneTicket(ctx, sm.client, &req)
  200. if err != nil {
  201. return "", err
  202. }
  203. return res.Returnval, nil
  204. }
  205. func (sm *Manager) CloneSession(ctx context.Context, ticket string) error {
  206. req := types.CloneSession{
  207. This: sm.Reference(),
  208. CloneTicket: ticket,
  209. }
  210. res, err := methods.CloneSession(ctx, sm.client, &req)
  211. if err != nil {
  212. return err
  213. }
  214. sm.userSession = &res.Returnval
  215. return nil
  216. }