code: public List<CloudSdkComponent> getComponents()
        throws ProcessHandlerException, JsonSyntaxException, CloudSdkNotFoundException,
            CloudSdkOutOfDateException, CloudSdkVersionFileException, IOException {
      sdk.validateCloudSdk();
  
      // gcloud components list --show-versions --format=json
      List<String> command =
          new ImmutableList.Builder<String>()
              .add("components", "list")
              .addAll(GcloudArgs.get("show-versions", true))
              .addAll(GcloudArgs.get("format", "json"))
              .build();
  
      String componentsJson = runCommand(command);
      return CloudSdkComponent.fromJsonList(componentsJson);
    }
docs: Returns the list of Cloud SDK Components and their settings, reported by the current gcloud
  installation. Unlike other methods in this class that call gcloud, this method always uses a
  synchronous ProcessRunner and will block until the gcloud process returns.
  
  @throws ProcessHandlerException when process runner encounters an error
  @throws JsonSyntaxException when the cloud SDK output cannot be parsed
  @throws CloudSdkNotFoundException when the Cloud SDK is not installed where expected
  @throws CloudSdkOutOfDateException when the installed Cloud SDK is too old