All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.openraven.magpie.plugins.gcp.discovery.services.SqlDiscovery Maven / Gradle / Ivy

The newest version!
package io.openraven.magpie.plugins.gcp.discovery.services;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.gax.core.CredentialsProvider;
import com.google.api.services.sqladmin.SQLAdmin;
import com.google.api.services.sqladmin.model.InstancesListResponse;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import io.openraven.magpie.api.Emitter;
import io.openraven.magpie.api.MagpieGcpResource;
import io.openraven.magpie.api.Session;
import io.openraven.magpie.data.gcp.sql.SqlInstance;
import io.openraven.magpie.plugins.gcp.discovery.GCPUtils;
import io.openraven.magpie.plugins.gcp.discovery.VersionedMagpieEnvelopeProvider;
import org.slf4j.Logger;

import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.List;
import java.util.Optional;

public class SqlDiscovery implements GCPDiscovery {
  private static final String SERVICE = "sql";


  @Override
  public String service() {
    return SERVICE;
  }

  @Override
  public void discover(ObjectMapper mapper, String projectId, Session session, Emitter emitter, Logger logger, Optional maybeCredentialsProvider) {
    final String RESOURCE_TYPE = SqlInstance.RESOURCE_TYPE;

    try {
      SQLAdmin sqlAdmin = initService(maybeCredentialsProvider);

      var request = sqlAdmin.instances().list(projectId);

      InstancesListResponse response;
      do {
        response = request.execute();
        if (response.getItems() == null) {
          continue;
        }
        for (var sqlInstance : response.getItems()) {
          final var assetId = GCPUtils.selfLinkToAssetId(sqlInstance.getSelfLink());
          var data = new MagpieGcpResource.MagpieGcpResourceBuilder(mapper, assetId)
            .withResourceName(sqlInstance.getName())
            .withResourceId(assetId)
            .withProjectId(projectId)
            .withResourceType(RESOURCE_TYPE)
            .withRegion(sqlInstance.getRegion())
            .withConfiguration(GCPUtils.asJsonNode(sqlInstance))
            .build();

          emitter.emit(VersionedMagpieEnvelopeProvider.create(session, List.of(fullService() + ":sqlInstance"), data.toJsonNode()));
        }
        request.setPageToken(response.getNextPageToken());
      } while (response.getNextPageToken() != null);

    } catch (GeneralSecurityException | IOException e) {
      logger.error("Unable to finish SQL discovery, due to: {}", e.getMessage());
    }
  }

  private static SQLAdmin initService(Optional maybeCredentialsProvider) throws GeneralSecurityException, IOException {
    GoogleCredentials credential;
    if(maybeCredentialsProvider.isPresent()){
      credential = (GoogleCredentials) maybeCredentialsProvider.get().getCredentials();
    } else {
      credential = GoogleCredentials.getApplicationDefault();
    }
    return new SQLAdmin.Builder(
      GoogleNetHttpTransport.newTrustedTransport(),
      JacksonFactory.getDefaultInstance(),
      new HttpCredentialsAdapter(credential))
      .setApplicationName("sql-instance")
      .build();
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy