pythonでvSphere操作　その4　vCenterログイン

#本題
結論から。

```python:login
from pyVim.connect import SmartConnectNoSSL, Disconnect
import atexit
import sys

si = SmartConnectNoSSL(host='<vCenterIP>',
                 user='<user>',
                 pwd='<password>',
                 port='<port>')

    if not service_instance:
        print("Could not connect to the specified host using specified "
              "username and password")
        sysexit(1)

atexit.register(Disconnect, si)
```

※atexitについては後日確認。
下記でキーワード検索してみるもヒットせず。
Managed Object(以下、MO)がモジュールでラッピングされている様子。
https://code.vmware.com/apis/196/vsphere#/doc/

ライブラリを見てみる。大体は以下に配置。
/lib/python2.7/site-packages/
接続関係はpyvmomiではなくてpyVimらしい。
/lib/python2.7/site-packages/pyVim
その中のconnect.pyを確認。

```python:connect.py抜粋
def SmartConnectNoSSL(protocol='https', host='localhost', port=443, user='root', pwd='',
                      service="hostd", path="/sdk",
                      preferredApiVersions=None, keyFile=None, certFile=None,
                      thumbprint=None, b64token=None, mechanism='userpass'):
   """
   Provides a standard method for connecting to a specified server without SSL
   verification. Useful when connecting to servers with self-signed certificates
   or when you wish to ignore SSL altogether. Will attempt to create an unverified
   SSL context and then connect via the SmartConnect method.
   """

   if hasattr(ssl, '_create_unverified_context'):
      sslContext = ssl._create_unverified_context()
   else:
      sslContext = None

   return SmartConnect(protocol=protocol,
                       host=host,
                       port=port,
                       user=user,
                       pwd=pwd,
                       service=service,
                       path=path,
                       preferredApiVersions=preferredApiVersions,
                       keyFile=keyFile,
                       certFile=certFile,
                       thumbprint=thumbprint,
                       sslContext=sslContext,
                       b64token=b64token,
                       mechanism=mechanism)
```

あった。
でもまだMOで検索できるに至っていないので、コードを追う。
return SmartConnectからSmartConnectメソッドを確認して、そこでreturn Connectしているので・・・といった形でトレース。

```python:connect.py抜粋

#def Connectの中身
   si, stub = None, None
   if mechanism == 'userpass':
      si, stub = __Login(host, port, user, pwd, service, adapter, version, path,
                         keyFile, certFile, thumbprint, sslContext)
   elif mechanism == 'sspi':
      si, stub = __LoginBySSPI(host, port, service, adapter, version, path,
                               keyFile, certFile, thumbprint, sslContext, b64token)
   else:
      raise Exception('''The provided connection mechanism is not available, the
              supported mechanisms are userpass or sspi''')

   SetSi(si)
```

今回、mechanism == 'userpass'を通る。
__Loginが実際に接続を行ってServiceInstanceを取得する本体。

```python:connect.py抜粋

def __Login(host, port, user, pwd, service, adapter, version, path,
            keyFile, certFile, thumbprint, sslContext):
   """
   Private method that performs the actual Connect and returns a
   connected service instance object.
   """
   content, si, stub = __RetrieveContent(host, port, adapter, version, path,
                                         keyFile, certFile, thumbprint, sslContext)

 try:
      x = content.sessionManager.Login(user, pwd, None)
   except vim.fault.InvalidLogin:
      raise
   except Exception as e:
      raise
   return si, stub
```

content.sessionManager.LoginのsessionManagerがMOとして最初のサイトで検索できた。で、下位にLoginがあると。これを操作しているのね。
ようやく納得できました。

以上。

#余談

atexitについて。

インタプリタ終了時(スクリプト終了時)に、カッコ内を自動的に実行してくれるかっこいい存在。

```python:py
atexit.register(Disconnect, si)
```
上記では、Disconnectメソッドを引数siで実行する。