def __init__(self, conn, accessInfo, platforminfo):
        self.conn = conn
        self.accessInfo = accessInfo

        self.client = CloudStackIaasClient(platforminfo, accessInfo["USER_NAME"], accessInfo["ACCESS_ID"], accessInfo["SECRET_KEY"])
        #コントローラ作成
        self.instancecontroller      = CloudStackInstanceController(platforminfo, self.client, self.conn)
        self.volumecontroller        = CloudStackVolumController(platforminfo, self.client, self.conn)
        self.addresscontroller       = CloudStackAddressController(platforminfo, self.client, self.conn)
        self.loadBalancercontroller  = CloudStackLoadBalancercontroller(platforminfo, self.client, self.conn)
        self.othercontroller         = CloudStackOtherController(platforminfo, self.client, self.conn)
class CloudStackController(IaasController):

    logger = IaasLogger()

    conn = None
    client = None
    accessInfo = None

    instancecontroller = None
    volumecontroller = None
    addresscontroller = None
    loadBalancercontroller = None
    othercontroller = None

    def __init__(self, conn, accessInfo, platforminfo):
        self.conn = conn
        self.accessInfo = accessInfo

        self.client = CloudStackIaasClient(platforminfo, accessInfo["USER_NAME"], accessInfo["ACCESS_ID"], accessInfo["SECRET_KEY"])
        #コントローラ作成
        self.instancecontroller      = CloudStackInstanceController(platforminfo, self.client, self.conn)
        self.volumecontroller        = CloudStackVolumController(platforminfo, self.client, self.conn)
        self.addresscontroller       = CloudStackAddressController(platforminfo, self.client, self.conn)
        self.loadBalancercontroller  = CloudStackLoadBalancercontroller(platforminfo, self.client, self.conn)
        self.othercontroller         = CloudStackOtherController(platforminfo, self.client, self.conn)

    def __del__(self):
        self.conn.rollback()
        self.conn.close()

    def describeDiskOfferings(self):
        return self.client.describeDiskOfferings()

    def describePublicIpAddresses(self, id):
        return self.client.describePublicIpAddresses(id)

    def describeOnlyInstances(self):
        return self.client.describeOnlyInstances()

    def describeServiceOfferings(self):
        return self.client.describeServiceOfferings()


    def describeImages(self):
        return self.client.describeImages()

    def describeInstances(self):
        return self.client.describeInstances()


    def startInstance(self, instanceNo):

        # インスタンスに関する処理   TODO タイムアウトリトライは未実装
        try:
            self.instancecontroller.startInstance(instanceNo)
        except Exception, e:
            self.logger.error(traceback.format_exc())
            raise

        # ボリュームに関する処理
        table = self.conn.getTable("CLOUDSTACK_VOLUME")
        volumes = self.conn.select(table.select(table.c.INSTANCE_NO==instanceNo))
        for volume in volumes:
            if isNotEmpty(volume["COMPONENT_NO"]):
                # コンポーネント番号がある場合はスキップ
                continue
            #Volumeスタート
            self.volumecontroller.startVolume(instanceNo, volume["VOLUME_NO"])

        # アドレスに関する処理
        self.addresscontroller.startAddress(instanceNo)

        self.conn.commit()
        return True