CloudSlang/cs-actions

View on GitHub
cs-google/src/main/scala/io/cloudslang/content/google/services/databases/sql/instances/SQLDatabaseInstanceService.scala

Summary

Maintainability
C
1 day
Test Coverage
/*
 * Copyright 2024 Open Text
 * This program and the accompanying materials
 * are made available under the terms of the Apache License v2.0 which accompany this distribution.
 *
 * The Apache License is available at
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */




package io.cloudslang.content.google.services.databases.sql.instances

import com.google.api.client.auth.oauth2.Credential
import com.google.api.client.http.HttpTransport
import com.google.api.client.json.JsonFactory
import com.google.api.services.sqladmin.model._
import io.cloudslang.content.google.services.databases._
import io.cloudslang.content.google.utils.action.InputNames.CreateSQLDatabaseInstanceInputs.{ACTIVATION_POLICY_ALWAYS, ACTIVATION_POLICY_NEVER, RESTART_INSTANCE, START_INSTANCE}

import scala.collection.JavaConversions._

object SQLDatabaseInstanceService {

  def get(httpTransport: HttpTransport, jsonFactory: JsonFactory, credential: Credential,
          projectId: String, databaseInstanceId: String):
  DatabaseInstance = DatabaseService.sqlDatabaseInstanceService(httpTransport, jsonFactory, credential)
    .get(projectId, databaseInstanceId)
    .execute()

  def list(httpTransport: HttpTransport, jsonFactory: JsonFactory, credential: Credential, project: String,
           filterOpt: Option[String]): List[DatabaseInstance] = {
    val databaseInstances = DatabaseService.sqlDatabaseInstanceService(httpTransport, jsonFactory, credential)
    val request = databaseInstances.list(project)

    filterOpt.foreach { filter => request.setFilter(filter) }

    var instances: List[DatabaseInstance] = List()
    var response: InstancesListResponse = null
    do {
      response = request.execute()
      if (response.getItems != null) {
        instances ++= response.getItems
        request.setPageToken(response.getNextPageToken)
      }
    } while (response.getNextPageToken != null)
    instances
  }

  def create(httpTransport: HttpTransport, jsonFactory: JsonFactory, credential: Credential, projectId: String,
             databaseInstanceId: String, password: String, region: String, zone: String, databaseVersion: String,
             tier: String, dataDiskType: String, dataDiskSizeInGB: Long,
             storageAutoResize: Boolean,privateNetwork: String, isIPV4Enabled: Boolean, availabilityType: String, maintenanceWindowDay: Int, maintenanceWindowHour: Int
             , activationPolicy: String, labels: java.util.Map[String, String], async: Boolean, timeout: Long,
             pollingInterval: Long): Operation = {

    val ipConfiguration = new IpConfiguration().setIpv4Enabled(isIPV4Enabled)

    if (privateNetwork.nonEmpty) {
      val privateNetworkStr = "projects/" + projectId + "/global/networks/" + privateNetwork
      ipConfiguration.setPrivateNetwork(privateNetworkStr)
    }

    val operation = DatabaseService.sqlDatabaseInstanceService(httpTransport, jsonFactory, credential)
      .insert(projectId, new DatabaseInstance().setProject(projectId).setName(databaseInstanceId).setRegion(region).
        setDatabaseVersion(databaseVersion).setRootPassword(password).setGceZone(zone).
        setSettings(new Settings().setTier(tier).setUserLabels(labels).setDataDiskType(dataDiskType)
          .setDataDiskSizeGb(dataDiskSizeInGB).setStorageAutoResize(storageAutoResize).
          setAvailabilityType(availabilityType)
          .setMaintenanceWindow(new MaintenanceWindow().setDay(maintenanceWindowDay).setHour(maintenanceWindowHour))
          .setActivationPolicy(activationPolicy).setIpConfiguration(ipConfiguration)
          .setBackupConfiguration(
            if (databaseVersion.contains("MYSQL")) new BackupConfiguration().setBinaryLogEnabled(true).setEnabled(true)
            else new BackupConfiguration().setEnabled(true))
        )).execute()

    DatabaseController.awaitSuccessOperation(httpTransport, jsonFactory, credential, projectId, operation,
      Some(databaseInstanceId)
      , async, timeout, pollingInterval)
  }

  def delete(httpTransport: HttpTransport, jsonFactory: JsonFactory, credential: Credential,
             projectId: String, databaseInstanceId: String, async: Boolean, timeout: Long,
             pollingInterval: Long): Operation = {
    val operation = DatabaseService.sqlDatabaseInstanceService(httpTransport, jsonFactory, credential)
      .delete(projectId, databaseInstanceId)
      .execute()
    DatabaseController.awaitSuccessOperation(httpTransport, jsonFactory, credential, projectId, operation,
      Some(databaseInstanceId)
      , async, timeout, pollingInterval)
  }

  def instanceOperation(httpTransport: HttpTransport, jsonFactory: JsonFactory, credential: Credential,
                        projectId: String, databaseInstanceId: String, instanceOperation: String, async: Boolean, timeout: Long,
                        pollingInterval: Long): Operation = {
    val operation =
      if (instanceOperation.equalsIgnoreCase(RESTART_INSTANCE)) {
        DatabaseService.sqlDatabaseInstanceService(httpTransport, jsonFactory, credential).restart(projectId, databaseInstanceId)
          .execute()
      } else {
        DatabaseService.sqlDatabaseInstanceService(httpTransport, jsonFactory, credential)
          .patch(projectId, databaseInstanceId, new DatabaseInstance()
            .setSettings(
              if (instanceOperation.equalsIgnoreCase(START_INSTANCE)) new Settings().setActivationPolicy(ACTIVATION_POLICY_ALWAYS)
              else new Settings().setActivationPolicy(ACTIVATION_POLICY_NEVER)
            )).execute()
      }
    DatabaseController.awaitSuccessOperation(httpTransport, jsonFactory, credential, projectId, operation,
      Some(databaseInstanceId)
      , async, timeout, pollingInterval)
  }

  def update(httpTransport: HttpTransport, jsonFactory: JsonFactory, credential: Credential, projectId: String,
             databaseInstanceId: String, zone: String, settingsVersion: Long, databaseVersion: String, tier: String,
             dataDiskSizeInGB: Long, storageAutoResize: Boolean, privateNetwork: String, isIPV4Enabled: Boolean, availabilityType: String,
             maintenanceWindowDay: Int, maintenanceWindowHour: Int, activationPolicy: String, labels: java.util.Map[String, String],
             async: Boolean, timeout: Long, pollingInterval: Long): Operation = {

    val databaseInstance = new DatabaseInstance()
    val settings = new Settings()
    val maintenanceWindow = new MaintenanceWindow().setDay(maintenanceWindowDay).setHour(maintenanceWindowHour)
    val ipConfiguration = new IpConfiguration().setIpv4Enabled(isIPV4Enabled)

    if (labels.nonEmpty) {
      settings.setUserLabels(labels)
    }

    if (zone.nonEmpty) {
      databaseInstance.setGceZone(zone)
    }

    if (dataDiskSizeInGB != 10 && dataDiskSizeInGB > 10) {
      settings.setDataDiskSizeGb(dataDiskSizeInGB)
    }
    if (availabilityType.nonEmpty) {
      settings.setAvailabilityType(availabilityType)
    }
    if (activationPolicy.nonEmpty) {
      settings.setActivationPolicy(activationPolicy)
    }

    if (privateNetwork.nonEmpty) {
      val privateNetworkStr = "projects/" + projectId + "/global/networks/" + privateNetwork
      ipConfiguration.setPrivateNetwork(privateNetworkStr)
    }

    settings.setTier(tier).setSettingsVersion(settingsVersion).setStorageAutoResize(storageAutoResize)
      .setIpConfiguration(ipConfiguration).setMaintenanceWindow(maintenanceWindow).setBackupConfiguration(
      if (databaseVersion.contains("MYSQL") && availabilityType.contains("REGIONAL")) new BackupConfiguration().setBinaryLogEnabled(true)
        .setEnabled(true)
      else new BackupConfiguration().setEnabled(true))

    databaseInstance.setSettings(settings)

    val operation = DatabaseService.sqlDatabaseInstanceService(httpTransport, jsonFactory, credential)
      .patch(projectId, databaseInstanceId, databaseInstance).execute()
    DatabaseController.awaitSuccessOperation(httpTransport, jsonFactory, credential, projectId, operation,
      Some(databaseInstanceId)
      , async, timeout, pollingInterval)

  }
}