private void createInstance()

in vandelay-bigtable/src/main/java/com/spotify/api/vandelay/bigtable/imports/VandelayBigTableImporter.java [151:223]


  private void createInstance(
      final String instanceId,
      final VandelayBigTableImportConfiguration importConfiguration,
      final BigtableInstanceAdminClient instanceAdminClient) {
    if (instanceAdminClient.exists(instanceId)) {
      logger.debug("Instance " + instanceId + " already exists");
      return;
    }

    final VandelayBigTableGCPConfiguration gcpConfiguration =
        importConfiguration.getGcpConfiguration();
    final VandelayBigTableInstanceConfiguration instanceConfiguration =
        gcpConfiguration.getInstanceConfiguration();
    final BigTableInstance configInstance = instanceConfiguration.getInstance();
    final Optional<Instance> instance =
        new BigTableInstanceMapperFunction().convertFrom(configInstance);
    if (instance.isPresent()) {
      logger.info("Creating create instance request for instance id " + instanceId);
      final CreateInstanceRequest createInstanceRequest =
          CreateInstanceRequest.of(instanceId)
              .setDisplayName(instance.get().getDisplayName())
              .setType(instance.get().getType());
      instance.get().getLabels().forEach(createInstanceRequest::addLabel);

      final List<BigTableCluster> clusters = instanceConfiguration.getClusters();
      logger.trace("Adding " + clusters.size() + " clusters to create instance request");
      for (final var cluster : clusters) {
        Optional<Cluster> savedCluster = new BigTableClusterMapperFunction().convertFrom(cluster);
        savedCluster.ifPresent(
            value ->
                createInstanceRequest.addCluster(
                    value.getId(), value.getZone(), value.getServeNodes(), value.getStorageType()));
      }

      logger.info("Performing create instance call");
      final Instance newInstance = instanceAdminClient.createInstance(createInstanceRequest);

      final List<BigTableAppProfile> appProfiles = instanceConfiguration.getAppProfiles();
      logger.info("Found " + appProfiles.size() + " app profiles for instance");
      for (final var appProfile : appProfiles) {
        final Optional<AppProfile> savedAppProfile =
            new BigTableAppProfileMapperFunction().convertFrom(appProfile);
        if (savedAppProfile.isPresent()) {
          if (Objects.isNull(
              instanceAdminClient.getAppProfile(
                  savedAppProfile.get().getInstanceId(), savedAppProfile.get().getId()))) {
            logger.info(
                "App profile " + savedAppProfile.get().getId() + " is not set, attempting to set");
            final CreateAppProfileRequest createAppProfileRequest =
                CreateAppProfileRequest.of(
                        savedAppProfile.get().getInstanceId(), savedAppProfile.get().getId())
                    .setDescription(savedAppProfile.get().getDescription())
                    .setRoutingPolicy(savedAppProfile.get().getPolicy());

            logger.info("Performing create app profile call");
            instanceAdminClient.createAppProfile(createAppProfileRequest);
          }
        }
      }

      final IAMPolicy savedPolicy = instanceConfiguration.getAppPolicy();
      final IAMPolicy changedPolicy =
          new IAMPolicy(null, savedPolicy.getVersion(), savedPolicy.getBindingList());
      final Optional<Policy> iamPolicy = new IAMPolicyMapperFunction().convertFrom(changedPolicy);
      if (iamPolicy.isPresent()) {
        if (!iamPolicy.get().equals(instanceAdminClient.getIamPolicy(newInstance.getId()))) {
          logger.info(
              "IAM policy on the instance does not match the expected one - setting IAM policy");
          instanceAdminClient.setIamPolicy(newInstance.getId(), iamPolicy.get());
        }
      }
    }
  }