【问题标题】:How to add user metadata to IBM Cloud virtual device order?如何将用户元数据添加到 IBM Cloud 虚拟设备订单?
【发布时间】:2018-06-03 07:42:27
【问题描述】:

我通过发布如下所示的 JSON,使用 NodeJS (JavaScript) 在 IBM Cloud(前 SoftLayer)上成功订购了新设备。现在我正在尝试修改我的订单并将用户元数据添加到每个订购的设备,但找不到轻松添加它的方法。

这是我的工作顺序(在一次 API 调用中请求 3 个 Ubuntu 机器):

var ibm_order = {
  imageTemplateGlobalIdentifier: 'a1237539-c54d-46dd-bece-c17c2329c607',
  imageTemplateId: '',
  location: 138124,
  packageId: 46,
  presetId: '',
  quantity: 3,
  sourceVirtualGuestId: '',
  useHourlyPricing: true,
  complexType: 'SoftLayer_Container_Product_Order_Virtual_Guest',
  prices: 
  [{id: 1641},        // description: 2 x 2.0 GHz Cores
    {id: 1647},       // description: 8 GB
    {id: 13899},      // description: 25 GB (LOCAL)
    {id: 905},        // description: Reboot / Remote Console
    {id: 274},        // description: 1 Gbps Public & Private Network Uplinks
    {id: 1800},       // description: 0 GB Bandwidth
    {id: 21},         // description: 1 IP Address
    {id: 55},         // description: Host Ping
    {id: 57},         // description: Email and Ticket
    {id: 58},         // description: Automated Notification
    {id: 420},        // description: Unlimited SSL VPN Users & 1 PPTP VPN User per account
    {id: 418}],       // description: Nessus Vulnerability Assessment & Reporting
    sshKeys: [{sshKeyIds: [4512]}],
    virtualGuests: [
      {domain: 'mydomain.com', hostname: 'rw-ff-dal05-1a'},
      {domain: 'mydomain.com', hostname: 'rw-ff-dal05-1b'},
      {domain: 'mydomain.com', hostname: 'rw-ff-dal05-1c'}
    ]
  }

这段代码使用softlayer-node npm发布上述订单:

  var SoftLayer = require('softlayer-node');
  var softlayer_client = new SoftLayer();

  // actual SL API call
  softlayer_client
  .auth(softlayer_username, softlayer_api_key)
  .path('Product_Order', 'placeOrder')
  .parameters(ibm_order)
  .post()
  .then(function(result:any) {
    console.log('success! result: ' + JSON.stringify(result, null, 4) );
  }, function(error:any) {
    console.log('error: details: ' + JSON.stringify(error, null, 4) );
  });

问题:如何将用户元数据添加到每个请求的设备? 用户元数据是一个字符串数组,它可能应该是 virtualGuests 数组元素的一部分(每个“虚拟来宾”都有自己的单独 user_metadata 数组),但是当我尝试指定“UserMetadata”时出现错误:

error: details: {
    "message": {
        "error": "The property 'UserMetadata' is not valid for 'SoftLayer_Virtual_Guest'.",
        "code": "SoftLayer_Exception_Public"
    },
    "statusCode": 500
}

我找到了这些 SoftLayer API 参考页面:
1) 参考 » 数据类型 » SoftLayer_Container_Product_Order_Virtual_Guest
2) 参考 » 服务 » SoftLayer_Virtual_Guest
但这些并不是 100% 相关的(他们建议使用 setUserMetadata 方法,但我所拥有的只是一个低级别的“预烘焙”JSON!)

或者是否有其他更优雅的方式从 NodeJS 的 IBM Cloud(前 SoftLayer)订购新设备?

【问题讨论】:

    标签: javascript node.js ibm-cloud ibm-cloud-infrastructure


    【解决方案1】:

    您是对的,但错误是由于您发送的属性“UserMetaData”,这不是virtualGuests 的有效属性,您要查找的特定属性称为“userData”,它在数据类型Virtual_Guest

    尝试以下方法:

    var ibm_order = {
    imageTemplateGlobalIdentifier: 'a1237539-c54d-46dd-bece-c17c2329c607',
    imageTemplateId: '',
    location: 138124,
    packageId: 46,
    presetId: '',
    quantity: 3,
    sourceVirtualGuestId: '',
    useHourlyPricing: true,
    complexType: 'SoftLayer_Container_Product_Order_Virtual_Guest',
    prices: 
    [{id: 1641},        // description: 2 x 2.0 GHz Cores
      {id: 1647},       // description: 8 GB
      {id: 13899},      // description: 25 GB (LOCAL)
      {id: 905},        // description: Reboot / Remote Console
      {id: 274},        // description: 1 Gbps Public & Private Network Uplinks
      {id: 1800},       // description: 0 GB Bandwidth
      {id: 21},         // description: 1 IP Address
      {id: 55},         // description: Host Ping
      {id: 57},         // description: Email and Ticket
      {id: 58},         // description: Automated Notification
      {id: 420},        // description: Unlimited SSL VPN Users & 1 PPTP VPN User per account
      {id: 418}],       // description: Nessus Vulnerability Assessment & Reporting
      sshKeys: [{sshKeyIds: [4512]}],
      virtualGuests: [
      {domain: 'mydomain.com', hostname: 'rw-ff-dal05-1a', userData: [{value: 'someValue1'}]},
      {domain: 'mydomain.com', hostname: 'rw-ff-dal05-1b', userData: [{value: 'someValue2'}]},
      {domain: 'mydomain.com', hostname: 'rw-ff-dal05-1c', userData: [{value: 'someValue3'}]}
      ]
    }
    

    有关更多信息,您可以在下面看到:

    http://sldn.softlayer.com/blog/jarteche/getting-started-user-data-and-post-provisioning-scripts

    Retrieving user metadata about a provisioned SoftLayer server comes back null

    https://sldn.softlayer.com/article/softlayer-api-overview

    【讨论】:

    • 谢谢你,费尔南多!你的建议有效!注意:“入门”链接建议添加两个字段:值和类型。我尝试在有和没有类型字段的情况下推送大约 5KB json(作为字符串)(最多允许 16K),并且在这两种情况下它都有效!这是 virtualGuests 数组元素 with 类型字段的扩展示例:{value: JSON.stringify(some_large_json), type: {keyname: 'USER_DATA', name: 'User Data'}}
    • 没问题,德米特里,很高兴为您提供帮助,感谢您提供的信息!,问候。
    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    相关资源
    最近更新 更多