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

com.databricks.sdk.scala.dbutils.SdkDBUtilsImpl.scala Maven / Gradle / Ivy

The newest version!
package com.databricks.sdk.scala
package dbutils

import com.databricks.sdk.WorkspaceClient
import com.databricks.sdk.core.{DatabricksConfig, DatabricksError}
import com.databricks.sdk.service.files.UploadRequest

import java.io.ByteArrayInputStream
import java.nio.charset.StandardCharsets
import scala.collection.JavaConverters._

private object SdkDbfsUtilsImpl {
  def unsupportedMethod(methodName: String): Nothing =
    throw new UnsupportedOperationException(s"Method $methodName is not supported in the SDK version of DBUtils.")

  def unsupportedField(fieldName: String): Nothing =
    throw new UnsupportedOperationException(s"Field $fieldName is not supported in the SDK version of DBUtils.")
}

/** Help is a no-op in the SDK version of DBUtils. */
trait NoHelp extends WithHelpMethods {
  override def help(): Unit = {}
  override def help(moduleOrMethod: String): Unit = {}
}

class SdkDBUtilsImpl(config: DatabricksConfig) extends DBUtils with NoHelp {
  private val client = new WorkspaceClient(config)
  def this() = this(new DatabricksConfig())

  override def widgets: WidgetsUtils = SdkDbfsUtilsImpl.unsupportedField("widgets")
  override def meta: MetaUtils = SdkDbfsUtilsImpl.unsupportedField("meta")
  override val fs: DbfsUtils = new SdkDbfsUtils(client)
  override def notebook: NotebookUtils = SdkDbfsUtilsImpl.unsupportedField("notebook")
  override def secrets: SecretUtils = new SdkSecretsUtils(client)
  override def library: LibraryUtils = SdkDbfsUtilsImpl.unsupportedField("library")
  override def credentials: DatabricksCredentialUtils = SdkDbfsUtilsImpl.unsupportedField("credentials")
  override def jobs: JobsUtils = SdkDbfsUtilsImpl.unsupportedField("jobs")
  override def data: DataUtils = SdkDbfsUtilsImpl.unsupportedField("data")
}

private class SdkDbfsUtils(w: WorkspaceClient) extends DbfsUtils with NoHelp {
  override def ls(dir: String): Seq[FileInfo] = SdkDbfsUtilsImpl.unsupportedMethod("dbutils.fs.ls")

  override def rm(file: String, recurse: Boolean): Boolean = {
    if (recurse) {
      throw new UnsupportedOperationException("Recursive delete is not yet supported in the SDK version of DBUtils.")
    }
    w.files().delete(file)
    // Should we list before and after? Swallow errors?
    true
  }

  override def mkdirs(dir: String): Boolean = SdkDbfsUtilsImpl.unsupportedMethod("dbutils.fs.mkdirs")

  override def cp(from: String, to: String, recurse: Boolean): Boolean = {
    if (recurse) {
      throw new UnsupportedOperationException("Recursive copy is not yet supported in the SDK version of DBUtils.")
    }
    mv(from, to, recurse, delete = false)
  }

  private def mv(from: String, to: String, recurse: Boolean, delete: Boolean): Boolean = {
    if (from == to) {
      return true
    }

    val inputStream = w.files().download(from).getContents
    try {
      w.files().upload(new UploadRequest().setFilePath(to).setContents(inputStream))
      if (delete) {
        w.files().delete(from)
      }
    } finally {
      inputStream.close()
    }
    // What to return here?
    true
  }

  override def mv(from: String, to: String, recurse: Boolean): Boolean = {
    if (recurse) {
      throw new UnsupportedOperationException("Recursive move is not yet supported in the SDK version of DBUtils.")
    }
    mv(from, to, recurse, delete = true)
  }

  override def head(file: String, maxBytes: Int): String = {
    val fileStream = w.files().download(file).getContents
    try {
      val byteArray = new Array[Byte](maxBytes)
      val numBytes = fileStream.read(byteArray)
      // Assuming the file is UTF-8-encoded
      new String(byteArray.slice(0, numBytes), StandardCharsets.UTF_8)
    } finally {
      fileStream.close()
    }
  }

  override def put(file: String, contents: String, overwrite: Boolean): Boolean = {
    try {
      w.files()
        .upload(
          new UploadRequest()
            .setFilePath(file)
            .setOverwrite(overwrite)
            .setContents(new ByteArrayInputStream(contents.getBytes(StandardCharsets.UTF_8))))
    } catch {
      case e: DatabricksError if e.getMessage == "No matching namespace can be found" =>
        throw new IllegalArgumentException(
          "requirement failed: Cannot upload to paths outside of /Volumes outside of DBR: " + file,
          e)
    }
    // What to return here?
    true
  }

  override def mount(
      source: String,
      mountPoint: String,
      encryptionType: String,
      owner: String,
      extraConfigs: Map[String, String]): Boolean = SdkDbfsUtilsImpl.unsupportedMethod("dbutils.fs.mount")

  override def updateMount(
      source: String,
      mountPoint: String,
      encryptionType: String,
      owner: String,
      extraConfigs: Map[String, String]): Boolean = SdkDbfsUtilsImpl.unsupportedMethod("dbutils.fs.updateMount")

  override def refreshMounts(): Boolean = SdkDbfsUtilsImpl.unsupportedMethod("dbutils.fs.refreshMounts")

  override def mounts(): Seq[MountInfo] = SdkDbfsUtilsImpl.unsupportedMethod("dbutils.fs.mounts")

  override def unmount(mountPoint: String): Boolean = SdkDbfsUtilsImpl.unsupportedMethod("dbutils.fs.unmount")
}

private class SdkSecretsUtils(client: WorkspaceClient) extends SecretUtils with NoHelp {
  override def get(scope: String, key: String): String =
    client.secrets().get(scope, key)

  override def getBytes(scope: String, key: String): Array[Byte] =
    client.secrets().getBytes(scope, key)

  override def list(scope: String): Seq[SecretMetadata] =
    client.secrets().listSecrets(scope).asScala.toSeq.map { secret =>
      SecretMetadata(secret.getKey)
    }

  override def listScopes(): Seq[SecretScope] =
    client.secrets().listScopes().asScala.toSeq.map { scope =>
      SecretScope(scope.getName)
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy