def install_cloud_sdk()

in daisy_workflows/image_import/ubuntu/translate.py [0:0]


def install_cloud_sdk(g: guestfs.GuestFS, ubuntu_release: str) -> None:
  """ Installs Google Cloud SDK, supporting apt and snap.

  Args:
    g: A mounted GuestFS instance.
    ubuntu_release: The release nickname (eg: trusty).
  """
  try:
    run(g, 'gcloud --version')
    logging.info('Found gcloud. Skipping installation of Google Cloud SDK.')
    return
  except RuntimeError:
    logging.info('Did not find previous install of gcloud.')

  if g.gcp_image_major < '18':
    g.write('/etc/apt/sources.list.d/partner.list',
            apt_cloud_sdk.format(ubuntu_release=ubuntu_release))
    utils.update_apt(g)
    utils.install_apt_packages(g, 'google-cloud-sdk')
    logging.info('Installed Google Cloud SDK with apt.')
    return

  # Starting at 18.04, Canonical installs the sdk using snap.
  # Running `snap install` directly is not an option here since it
  # requires the snapd daemon to be running on the guest.
  g.write('/etc/cloud/cloud.cfg.d/91-google-cloud-sdk.cfg',
          cloud_init_cloud_sdk)
  logging.info(
    'Google Cloud SDK will be installed using snap with cloud-init.')

  # Include /snap/bin in the PATH for startup and shutdown scripts.
  # This was present in the old guest agent, but lost in the new guest
  # agent.
  for p in ['/lib/systemd/system/google-shutdown-scripts.service',
            '/lib/systemd/system/google-startup-scripts.service']:
    logging.debug('[%s] Checking whether /bin/snap is on PATH.', p)
    if not g.exists(p):
      logging.debug('[%s] Skipping: Unit not found.', p)
      continue
    original_unit = g.cat(p)
    # Check whether the PATH is already set; if so, skip patching to avoid
    # overwriting existing directive.
    match = re.search('Environment=[\'"]?PATH.*', original_unit,
                      flags=re.IGNORECASE)
    if match:
      logging.debug('[%s] Skipping: PATH already defined in unit file: %s.', p,
                    match.group())
      continue
    # Add Environment directive to unit file, and show diff in debug log.
    patched_unit = original_unit.replace('[Service]', snap_env_directive)
    g.write(p, patched_unit)
    diff = '\n'.join(Differ().compare(original_unit.splitlines(),
                                      patched_unit.splitlines()))
    logging.debug('[%s] PATH not defined. Added:\n%s', p, diff)