如何列出VSI的Flavor?SoftLayer查询掩码使用问题求助
哦,我明白你的问题了——你想用API获取已存在VSI对应的flavorKeyName,但用mask查询supplementalCreateObjectOptions字段一直拿不到结果对吧?其实这里有个关键的误解,我来给你捋清楚:
为什么你的mask查询无效?
supplementalCreateObjectOptions这个字段不是已存在VSI的持久属性,它只是在调用SoftLayer_Virtual_Guest/createObject创建VSI时,用来传递额外配置(比如指定flavor)的输入参数。所以你查询已有的VSI实例时,这个字段根本不会返回,自然拿不到flavorKeyName。
那该怎么正确获取已存在VSI对应的flavor呢?下面给你两种可行的方法:
方法一:通过硬件配置匹配对应Flavor
每个VSI flavor都对应固定的CPU、内存、磁盘等硬件配置组合,我们可以先获取所有可用的flavor配置,再和目标VSI的硬件参数做匹配:
获取所有可用的VSI Flavor配置
调用SoftLayer_Product_Package/getItems接口,指定packageId为46(这是VSI对应的产品包ID),过滤出CPU、内存、磁盘相关的配置项:import SoftLayer client = SoftLayer.create_client_from_env() package_id = 46 # VSI产品包固定ID # 获取CPU、内存、磁盘的配置项 flavor_items = client['SoftLayer_Product_Package'].getItems( id=package_id, filter={ "items": { "itemCategory": { "categoryCode": { "in": ["guest_core", "ram", "disk0"] } } } } )获取目标VSI的硬件参数
调用SoftLayer_Virtual_Guest/getObject获取VSI的CPU、内存、磁盘等信息:vsi_id = 1234567 # 替换成你的VSI ID vsi_details = client['SoftLayer_Virtual_Guest'].getObject( id=vsi_id, mask="maxCpu, maxMemory, localDiskFlag, blockDevices[diskImage[capacity]]" )匹配对应的Flavor
根据VSI的硬件参数,和flavor配置项做匹配,最终得到对应的flavorKeyName(比如B1_2X4代表2核4G的基础型实例)。实际场景中可以根据需要补充磁盘类型、带宽等更精确的匹配逻辑。
方法二:通过升级选项反向推断当前Flavor
如果你只是想快速确认当前VSI的flavor范围,可以调用SoftLayer_Virtual_Guest/getUpgradeItemPrices接口,获取该实例可升级的所有flavor选项,反向推断当前的基础配置对应的flavor。不过这种方法不如直接匹配硬件配置准确。
额外补充:创建VSI前获取可用Flavors
如果你的需求是创建VSI前获取所有可用的flavorKeyName,可以直接调用SoftLayer_Product_Package/getItemPrices,过滤出包含flavorKeyName属性的价格项:
flavor_prices = client['SoftLayer_Product_Package'].getItemPrices( id=package_id, filter={ "itemPrices": { "attributes": { "name": { "operation": "flavorKeyName" } } } } ) # 提取所有flavorKeyName for price in flavor_prices: for attr in price['attributes']: if attr['name'] == 'flavorKeyName': print(f"可用Flavor: {attr['value']}")
内容的提问来源于stack exchange,提问作者AlexDevC

