#
# Azure
#
from vcpsdk.plugins.spec import VcpSpecResource
import vcplib.occtr # VcNodeの型チェックのため
CCI_VERSION = "1.2"
BUILD_VERSION = "20191001"
[ドキュメント]
class VcpSpecResourceAzure(VcpSpecResource):
"""
サンプルコード
.. code-block:: python
spec = sdk.get_spec("azure", "small")
#
# 変更できること
#
# spec.num_nodes = 1
# spec.params_v = ['/opt:/opt']
# spec.params_e = ['USER_NAME=test']
# spec.ip_addresses = ['起動するnodeの静的なIPアドレス']
# Azure 依存パラメータ
# https://www.terraform.io/docs/providers/azurerm/index.html
# spec.vm_size = 'Standard_LRS' # Standard_LRS|Premium_LRS ...
# spec.disk_size_gb = 40
# spec.managed_disk_type = "standard" # standard|io1|gp2|sc1|st1
# 追加で使用するVolume
# spec.disks = ['azure-volume-abc']
# or
# my_disks = disk_unit.find_nodes()
# spec.disks = [my_disks[0]] # VC disk指定
# cloud上のイメージ設定
# spec.cloud_image = 'niivcp-20170616'
# cloud上のタグ設定
spec.set_tag('key1', 'value1')
spec.set_tag('key2', 'value2')
# base containerにssh loginするためのssh公開鍵情報を設定
spec.set_ssh_pubkey('tmp/id_rsa.pub')
"""
version = CCI_VERSION + "+" + BUILD_VERSION
def __init__(self, provider_name, flavor, config_dir):
# flavor から spec を設定
super().__init__(provider_name, flavor, config_dir)
# spec attributes名の設定チェックの回避
super().__setattr__("azure_cci_", None)
# credentail情報は、vcp_config から設定
self.azure_cci_ = {"cci_version": CCI_VERSION}
self.azure_cci_["subscription_id"] = self.vcp_config_["azure"][
"subscription_id"
]
self.azure_cci_["client_id"] = self.vcp_config_["azure"]["client_id"]
self.azure_cci_["client_secret"] = self.vcp_config_["azure"]["client_secret"]
self.azure_cci_["tenant_id"] = self.vcp_config_["azure"]["tenant_id"]
self.unit_cci_["private_network"] = self.vcp_config_["azure"][
"private_network"
] # VPNネットワーク名
# flavorから初期化
self.azure_cci_["vm_size"] = self.flavor_["vm_size"]
self.azure_cci_["disk_size_gb"] = self.flavor_["disk_size_gb"]
self.azure_cci_["managed_disk_type"] = self.flavor_["managed_disk_type"]
# cloud_image
self.azure_cci_["cloud_image"] = "default"
# 初期化
self.azure_cci_["ip_address_list"] = []
self.azure_cci_["ext_managed_disk"] = []
def __str__(self):
text = """
========================
{provider_name}
------------------------
{unit_info}
""".format(
provider_name=self.unit_cci_["cloud_provider"], unit_info=super().__str__()
)
text += """
vm_size: {vm_size}
disk_size_gb: {disk_size_gb}
managed_disk_type: {managed_disk_type}
ext_managed_disk: {ext_managed_disk}
cloud_image: {cloud_image}
ip_address_list: {ip_address_list}""".format_map(
self.azure_cci_
)
text += """
tags: {}
========================""".format(
self.cci_tags()
)
return text
[ドキュメント]
def cci(self, name):
"""
CCI生成
:param name: unit名
:return: CCI文字列
"""
# yaml schema check
self.cci_schema_.validate(self.azure_cci_, "azure")
# azure
my_cci = super().cci(name)
my_cci += """
cloud_provider: azure
cloud_params:
cci_version: "{cci_version}"
vm_size: {vm_size}
disk_size_gb: {disk_size_gb}
managed_disk_type: {managed_disk_type}
cloud_image: {cloud_image}
subscription_id: {subscription_id}
client_id: {client_id}
client_secret: {client_secret}
tenant_id: {tenant_id}
ip_address_list: {ip_address_list}
ext_managed_disk: {ext_managed_disk}""".format_map(
self.azure_cci_
)
# cloud tagのcci文字列生成
my_cci += self.cci_tags()
return my_cci
# property: vm_size
@property
def vm_size(self):
"""
Azureに依存する vm_size
.. note::
* VCP SDK flavorで設定可能
"""
return self.azure_cci_["vm_size"]
@vm_size.setter
def vm_size(self, v):
self.azure_cci_["vm_size"] = v
# property: disk_size_gb
@property
def disk_size_gb(self):
"""
Azureに依存する disk_size_gb (単位:GB)
.. note::
* VCP SDK flavorで設定可能
"""
return self.azure_cci_["disk_size_gb"]
@disk_size_gb.setter
def disk_size_gb(self, v):
self.azure_cci_["disk_size_gb"] = v
# property: managed_disk_type
@property
def managed_disk_type(self):
"""
Azureに依存する managed_disk_type
.. note::
* VCP SDK flavorで設定可能
"""
return self.azure_cci_["managed_disk_type"]
@managed_disk_type.setter
def managed_disk_type(self, v):
self.azure_cci_["managed_disk_type"] = v
# property: disks
@property
def disks(self):
"""
Azureに依存する ext_managed_disk
"""
return self.azure_cci_["ext_managed_disk"]
@disks.setter
def disks(self, v):
# ext_managed_disk は、/subscriptions/d47388de-3ed7-4...形式 と VcNode の2種類がある
volumes = []
for volume in v:
if isinstance(volume, vcplib.occtr.VcNode):
# VcNode 指定
volume_id = "vcp:{vc_id}:{unit_name}:{disk_id}".format(
vc_id=volume.vc.vcid, unit_name=volume.unit.name, disk_id=volume.id
)
else:
volume_id = volume # /subscriptions/d47388de-3ed7-4...指定
volumes.append(volume_id)
self.azure_cci_["ext_managed_disk"] = volumes
# property: ip_addresses
@property
def ip_addresses(self):
return self.azure_cci_["ip_address_list"]
@ip_addresses.setter
def ip_addresses(self, v):
"""
静的ip_address_list
.. note::
`num_nodes` と `ip_addresses` は最後にセットされたほうが有効になる。
"""
# num_nodesを上書きする
if 0 < len(v):
self.unit_cci_["num_nodes"] = len(v)
self.azure_cci_["ip_address_list"] = v
#
# Azure CloudImage
#
# property: cloud_image
@property
def cloud_image(self):
"""
Azureに依存する cloud_image
"""
return self.azure_cci_["cloud_image"]
@cloud_image.setter
def cloud_image(self, v):
self.azure_cci_["cloud_image"] = v
@VcpSpecResource.num_nodes.setter
def num_nodes(self, v):
"""
起動するnodeの個数
.. note::
`num_nodes` と `ip_addresses` は最後にセットされたほうが有効になる。
"""
self.unit_cci_["num_nodes"] = v
self.azure_cci_["ip_address_list"] = []
def __setattr__(self, name, value):
"""
spec の attributes に不正な値を設定した場合に例外を発生
:param name: attributes名
:param value: 設定値
"""
if not hasattr(self, name):
raise AttributeError("spec resource has no attributes!! [{}]".format(name))
super().__setattr__(name, value)