从已停止的实例中分离磁盘

时间:2017-05-29 02:09:11

标签: google-api google-compute-engine google-api-python-client

我正在尝试从当前持有磁盘的已停止实例中分离磁盘。这是我目前的表现。

def detach_disk_from_instance(disk_name, zone=GCLOUD_ZONE):
    disk_info = get_disk_info(disk_name=disk_name, zone=zone)
    if disk_info.get('users'):
        instance_name = disk_info['users'][0].rsplit('/').pop()
        logger.info("detatching disk : {} from instance : {}".format(disk_name, instance_name))
        request = compute.instances().detachDisk(
            project=GCLOUD_PROJECT_NAME, zone=zone, instance=instance_name, deviceName=disk_name)
        return make_http_request(request, {})

def wait_for_operation(operation, zone=GCLOUD_ZONE, worker=1):
    logger.info('Waiting for operation {} to finish...'.format(operation))
    with ThreadPoolExecutor(worker) as executor:
        future = executor.submit(_check_operation_status, operation=operation, zone=zone)
        wait([future])
        return future.result()

req = detach_disk_from_instance(disk_name='test-disk')
wait_for_operation(operation=req['name'])
如果正在运行的磁盘实例正在运行,则

上面的代码可以正常工作。 但是如果实例停止则它不起作用。当我尝试从已停止的实例中分离磁盘时,出现以下错误。

  

{'errors':[{'message':“找不到附带设备名称的磁盘   'test-disk'“,'code':'INVALID_USAGE'}]}

我向你保证磁盘仍然附加到实例,gcp仪表板也显示了。

1 个答案:

答案 0 :(得分:0)

TL; DR - 您正在传递磁盘资源的device name,而不是磁盘附加到实例的deviceName

instances.attachDisk请求将磁盘附加到VM实例的情况下,您可以在请求的deviceName字段中指定设备名称。

  

<强> DEVICENAME

     

的字符串

     

指定您选择的唯一设备名称   反映在Linux的/ dev / disk / by-id / google- *树中   在实例中运行的操作系统。这个名字可以用来   从内部引用用于安装,调整大小等的设备   实例。

     

如果未指定,服务器将选择要应用的默认设备名称   此磁盘的格式为 persistent-disks-x,其中x是数字   由Google Compute Engine分配。此字段仅适用于   持久性磁盘。

您需要将此名称用作instances.detachDisk请求的persistent-disks-x查询参数。

  

必需的查询参数

     

<强> DEVICENAME

     

的字符串

     

要分离的磁盘设备名称。

如文档中所述,如果您在附加磁盘时未指定设备名称,GCE将以textSize格式生成设备名称,您必须指定此名称。