diff --git a/connector/pom.xml b/connector/pom.xml
index 0cfe3b5c..54ef79b0 100644
--- a/connector/pom.xml
+++ b/connector/pom.xml
@@ -37,28 +37,11 @@
com.microsoft.azure.kusto
kusto-data
${kusto.sdk.version}
-
-
- com.microsoft.azure
- msal4j
-
-
-
-
- com.microsoft.azure
- msal4j
- ${msal4j.version}
com.microsoft.azure.kusto
kusto-ingest
${kusto.sdk.version}
-
-
- com.microsoft.azure
- msal4j
-
-
com.azure
diff --git a/connector/src/main/scala/com/microsoft/kusto/spark/authentication/DeviceAuthentication.scala b/connector/src/main/scala/com/microsoft/kusto/spark/authentication/DeviceAuthentication.scala
index 4326e908..612b6a23 100644
--- a/connector/src/main/scala/com/microsoft/kusto/spark/authentication/DeviceAuthentication.scala
+++ b/connector/src/main/scala/com/microsoft/kusto/spark/authentication/DeviceAuthentication.scala
@@ -1,59 +1,45 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License.
-
-package com.microsoft.kusto.spark.authentication
-
-import java.util.concurrent.{CompletableFuture, TimeUnit}
-import java.util.function.Consumer
-import com.microsoft.aad.msal4j.{DeviceCode, DeviceCodeFlowParameters, IAuthenticationResult}
-import com.microsoft.azure.kusto.data.auth
-import scala.concurrent.TimeoutException
-
-class DeviceAuthentication(val cluster: String, val authority: String)
- extends auth.DeviceAuthTokenProvider(cluster, authority, null) {
- var currentDeviceCode: Option[DeviceCode] = None
- var expiresAt: Option[Long] = None
- val NewDeviceCodeFetchTimeout = 60L * 1000L
- var currentToken: Option[String] = None
-
- override def acquireNewAccessToken(): IAuthenticationResult = {
- acquireNewAccessTokenAsync().get(NewDeviceCodeFetchTimeout, TimeUnit.MILLISECONDS)
- }
-
- def acquireNewAccessTokenAsync(): CompletableFuture[IAuthenticationResult] = {
- val deviceCodeConsumer: Consumer[DeviceCode] = toJavaConsumer((deviceCode: DeviceCode) => {
- this.currentDeviceCode = Some(deviceCode)
- this.expiresAt = Some(System.currentTimeMillis + (deviceCode.expiresIn() * 1000))
- println(deviceCode.message())
- })
-
- val deviceCodeFlowParams: DeviceCodeFlowParameters =
- DeviceCodeFlowParameters.builder(scopes, deviceCodeConsumer).build
- clientApplication.acquireToken(deviceCodeFlowParams)
- }
-
- implicit def toJavaConsumer[T](f: Function1[T, Unit]): Consumer[T] = new Consumer[T] {
- override def accept(t: T) = f(t)
- }
-
- def refreshIfNeeded(): Unit = {
- if (currentDeviceCode.isEmpty || expiresAt.get <= System.currentTimeMillis) {
- currentToken = Some(acquireAccessToken())
- }
- }
-
- def getDeviceCodeMessage: String = {
- refreshIfNeeded()
- this.currentDeviceCode.get.message()
- }
-
- def getDeviceCode: DeviceCode = {
- refreshIfNeeded()
- this.currentDeviceCode.get
- }
-
- def acquireToken(): String = {
- refreshIfNeeded()
- currentToken.get
- }
-}
+//// Copyright (c) Microsoft Corporation. All rights reserved.
+//// Licensed under the MIT License.
+//
+//package com.microsoft.kusto.spark.authentication
+//
+//import com.azure.core.credential.TokenRequestContext
+//import com.azure.identity.DeviceCodeCredentialBuilder
+//import com.microsoft.azure.kusto.data.auth
+//
+//import java.time.Duration
+//import scala.collection.convert.ImplicitConversions.`collection AsScalaIterable`
+//
+//class DeviceAuthentication(val cluster: String, val authority: String)
+// extends auth.DeviceAuthTokenProvider(cluster, authority, null) {
+// private val newDeviceCodeFetchTimeout = 60L * 1000L
+// private var expiresAt: Option[Long] = Some(0L)
+// private var currentToken: Option[String] = None
+//
+// def acquireToken(): String = {
+// refreshIfNeeded()
+// currentToken.get
+// }
+//
+// private def refreshIfNeeded(): Unit = {
+// if (isRefreshNeeded) {
+// val tokenCredential =
+// acquireNewAccessToken.getToken(new TokenRequestContext().addScopes(scopes.toSeq: _*))
+// val tokenCredentialValue =
+// tokenCredential.blockOptional(Duration.ofMillis(newDeviceCodeFetchTimeout))
+// tokenCredentialValue.ifPresent(token => {
+// currentToken = Some(token.getToken)
+// expiresAt = Some(token.getExpiresAt.toEpochSecond * 1000)
+// })
+// }
+// }
+//
+// private def acquireNewAccessToken = {
+// val deviceCodeFlowParams = new DeviceCodeCredentialBuilder()
+// super.createTokenCredential(deviceCodeFlowParams)
+// }
+//
+// private def isRefreshNeeded: Boolean = {
+// expiresAt.isEmpty || expiresAt.get < System.currentTimeMillis()
+// }
+//}
diff --git a/connector/src/main/scala/com/microsoft/kusto/spark/utils/ExtendedKustoClient.scala b/connector/src/main/scala/com/microsoft/kusto/spark/utils/ExtendedKustoClient.scala
index 23828636..f3b6347c 100644
--- a/connector/src/main/scala/com/microsoft/kusto/spark/utils/ExtendedKustoClient.scala
+++ b/connector/src/main/scala/com/microsoft/kusto/spark/utils/ExtendedKustoClient.scala
@@ -158,7 +158,7 @@ class ExtendedKustoClient(
maybeCrp: Option[ClientRequestProperties],
retryConfig: Option[RetryConfig] = None): KustoOperationResult = {
KDSU.retryApplyFunction(
- () => dmClient.execute(ExtendedKustoClient.DefaultDb, command, maybeCrp.orNull),
+ () => dmClient.executeMgmt(ExtendedKustoClient.DefaultDb, command, maybeCrp.orNull),
retryConfig.getOrElse(this.retryConfig),
"Execute DM command with retries")
}
@@ -553,8 +553,12 @@ class ExtendedKustoClient(
crp: ClientRequestProperties,
retryConfig: Option[RetryConfig] = None): KustoOperationResult = {
// TODO - CID should reflect retries
+ val isMgmtCommand = command.startsWith(".")
KDSU.retryApplyFunction(
- () => engineClient.execute(database, command, crp),
+ () =>
+ if (isMgmtCommand) {
+ engineClient.executeMgmt(database, command, crp)
+ } else { engineClient.executeQuery(database, command, crp) },
retryConfig.getOrElse(this.retryConfig),
"Execute engine command with retries")
}
diff --git a/connector/src/main/scala/com/microsoft/kusto/spark/utils/KustoDataSourceUtils.scala b/connector/src/main/scala/com/microsoft/kusto/spark/utils/KustoDataSourceUtils.scala
index 90219313..0083dc5a 100644
--- a/connector/src/main/scala/com/microsoft/kusto/spark/utils/KustoDataSourceUtils.scala
+++ b/connector/src/main/scala/com/microsoft/kusto/spark/utils/KustoDataSourceUtils.scala
@@ -315,9 +315,9 @@ object KustoDataSourceUtils {
logWarn(
"parseSourceParameters",
"No authentication method was supplied - using device code authentication. The token should last for one hour")
- val deviceCodeProvider = new DeviceAuthentication(clusterUrl, authorityId)
- val accessToken = deviceCodeProvider.acquireToken()
- authentication = KustoAccessTokenAuthentication(accessToken)
+// val deviceCodeProvider = new DeviceAuthentication(clusterUrl, authorityId)
+// val accessToken = deviceCodeProvider.acquireToken()
+// authentication = KustoAccessTokenAuthentication(accessToken)
}
}
(authentication, keyVaultAuthentication)
@@ -722,7 +722,7 @@ object KustoDataSourceUtils {
val statusCol = "Status"
val statusCheck: () => Option[KustoResultSetTable] = () => {
try {
- Some(client.execute(database, operationsShowCommand).getPrimaryResults)
+ Some(client.executeMgmt(database, operationsShowCommand).getPrimaryResults)
} catch {
case e: DataServiceException =>
if (e.isPermanent) {
@@ -852,7 +852,7 @@ object KustoDataSourceUtils {
query: String,
database: String,
crp: ClientRequestProperties): Int = {
- val res = client.execute(database, generateCountQuery(query), crp).getPrimaryResults
+ val res = client.executeQuery(database, generateCountQuery(query), crp).getPrimaryResults
res.next()
res.getInt(0)
}
@@ -866,7 +866,9 @@ object KustoDataSourceUtils {
val estimationResult: util.List[AnyRef] = Await.result(
Future {
val res =
- client.execute(database, generateEstimateRowsCountQuery(query), crp).getPrimaryResults
+ client
+ .executeQuery(database, generateEstimateRowsCountQuery(query), crp)
+ .getPrimaryResults
res.next()
res.getCurrentRow
},
@@ -887,7 +889,8 @@ object KustoDataSourceUtils {
if (estimatedCount == 0) {
Await.result(
Future {
- val res = client.execute(database, generateCountQuery(query), crp).getPrimaryResults
+ val res =
+ client.executeQuery(database, generateCountQuery(query), crp).getPrimaryResults
res.next()
res.getInt(0)
},
diff --git a/connector/src/test/scala/com/microsoft/kusto/spark/ExtendedKustoClientTests.scala b/connector/src/test/scala/com/microsoft/kusto/spark/ExtendedKustoClientTests.scala
index c33bc1dd..5513a302 100644
--- a/connector/src/test/scala/com/microsoft/kusto/spark/ExtendedKustoClientTests.scala
+++ b/connector/src/test/scala/com/microsoft/kusto/spark/ExtendedKustoClientTests.scala
@@ -80,6 +80,6 @@ class ExtendedKustoClientTests extends AnyFlatSpec with Matchers {
WriteOptions(writeMode = WriteMode.Queued),
null,
true)
- verify(stubbedClient.engineClient, times(0)).execute(any(), any(), any())
+ verify(stubbedClient.engineClient, times(0)).executeMgmt(any(), any(), any())
}
}
diff --git a/connector/src/test/scala/com/microsoft/kusto/spark/KustoAuthenticationTestE2E.scala b/connector/src/test/scala/com/microsoft/kusto/spark/KustoAuthenticationTestE2E.scala
index fae06caa..10afa7dc 100644
--- a/connector/src/test/scala/com/microsoft/kusto/spark/KustoAuthenticationTestE2E.scala
+++ b/connector/src/test/scala/com/microsoft/kusto/spark/KustoAuthenticationTestE2E.scala
@@ -1,7 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
-
package com.microsoft.kusto.spark
import com.microsoft.azure.kusto.data.ClientFactory
@@ -22,7 +21,8 @@ class KustoAuthenticationTestE2E extends AnyFlatSpec {
.appName("KustoSink")
.master(f"local[2]")
.getOrCreate()
- private lazy val kustoConnectionOptions: KustoConnectionOptions = KustoTestUtils.getSystemTestOptions()
+ private lazy val kustoConnectionOptions: KustoConnectionOptions =
+ KustoTestUtils.getSystemTestOptions()
val keyVaultAppId: String = System.getProperty(KustoSinkOptions.KEY_VAULT_APP_ID)
val keyVaultAppKey: String = System.getProperty(KustoSinkOptions.KEY_VAULT_APP_KEY)
@@ -38,19 +38,25 @@ class KustoAuthenticationTestE2E extends AnyFlatSpec {
val prefix = "keyVaultAuthentication"
val table = KustoQueryUtils.simplifyName(s"${prefix}_${UUID.randomUUID()}")
val engineKcsb = ConnectionStringBuilder.createWithAadAccessTokenAuthentication(
- kustoConnectionOptions.cluster,kustoConnectionOptions.accessToken)
+ kustoConnectionOptions.cluster,
+ kustoConnectionOptions.accessToken)
val kustoAdminClient = ClientFactory.createClient(engineKcsb)
val df = rows.toDF("name", "value")
val conf: Map[String, String] = Map(
KustoSinkOptions.KEY_VAULT_URI -> keyVaultUri,
KustoSinkOptions.KEY_VAULT_APP_ID -> (if (keyVaultAppId == null) "" else keyVaultAppId),
- KustoSinkOptions.KEY_VAULT_APP_KEY -> (if (keyVaultAppKey == null) {""} else keyVaultAppKey),
+ KustoSinkOptions.KEY_VAULT_APP_KEY -> (if (keyVaultAppKey == null) { "" }
+ else keyVaultAppKey),
KustoSinkOptions.KUSTO_TABLE_CREATE_OPTIONS -> SinkTableCreationMode.CreateIfNotExist.toString)
df.write.kusto(kustoConnectionOptions.cluster, kustoConnectionOptions.database, table, conf)
- val dfResult = spark.read.kusto(kustoConnectionOptions.cluster, kustoConnectionOptions.database, table, conf)
+ val dfResult = spark.read.kusto(
+ kustoConnectionOptions.cluster,
+ kustoConnectionOptions.database,
+ table,
+ conf)
val result = dfResult.select("name", "value").rdd.collect().sortBy(x => x.getInt(1))
val orig = df.select("name", "value").rdd.collect().sortBy(x => x.getInt(1))
@@ -75,41 +81,45 @@ class KustoAuthenticationTestE2E extends AnyFlatSpec {
df.write.kusto(kustoConnectionOptions.cluster, kustoConnectionOptions.database, table, conf)
- val dfResult = spark.read.kusto(kustoConnectionOptions.cluster, kustoConnectionOptions.database, table, conf)
+ val dfResult = spark.read.kusto(
+ kustoConnectionOptions.cluster,
+ kustoConnectionOptions.database,
+ table,
+ conf)
val result = dfResult.select("name", "value").rdd.collect().sortBy(x => x.getInt(1))
val orig = df.select("name", "value").rdd.collect().sortBy(x => x.getInt(1))
assert(result.diff(orig).isEmpty)
}
- "deviceAuthentication" should "use aad device authentication" taggedAs KustoE2E in {
- import spark.implicits._
- val expectedNumberOfRows = 1000
- val timeoutMs: Int = 8 * 60 * 1000 // 8 minutes
-
- val rows: immutable.IndexedSeq[(String, Int)] =
- (1 to expectedNumberOfRows).map(v => (s"row-$v", v))
- val prefix = "deviceAuthentication"
- val table = KustoQueryUtils.simplifyName(s"${prefix}_${UUID.randomUUID()}")
-
- val deviceAuth = new com.microsoft.kusto.spark.authentication.DeviceAuthentication(
- kustoConnectionOptions.cluster,
- kustoConnectionOptions.tenantId)
- val token = deviceAuth.acquireToken()
- val engineKcsb = ConnectionStringBuilder.createWithAadAccessTokenAuthentication(
- kustoConnectionOptions.cluster,
- token)
- val kustoAdminClient = ClientFactory.createClient(engineKcsb)
- val df = rows.toDF("name", "value")
- val conf: Map[String, String] = Map(
- KustoSinkOptions.KUSTO_TABLE_CREATE_OPTIONS -> SinkTableCreationMode.CreateIfNotExist.toString)
- df.write.kusto(kustoConnectionOptions.cluster, kustoConnectionOptions.database, table, conf)
- KustoTestUtils.validateResultsAndCleanup(
- kustoAdminClient,
- table,
- kustoConnectionOptions.database,
- expectedNumberOfRows,
- timeoutMs,
- tableCleanupPrefix = prefix)
- }
+// "deviceAuthentication" should "use aad device authentication" taggedAs KustoE2E in {
+// import spark.implicits._
+// val expectedNumberOfRows = 1000
+// val timeoutMs: Int = 8 * 60 * 1000 // 8 minutes
+//
+// val rows: immutable.IndexedSeq[(String, Int)] =
+// (1 to expectedNumberOfRows).map(v => (s"row-$v", v))
+// val prefix = "deviceAuthentication"
+// val table = KustoQueryUtils.simplifyName(s"${prefix}_${UUID.randomUUID()}")
+//
+// val deviceAuth = new com.microsoft.kusto.spark.authentication.DeviceAuthentication(
+// kustoConnectionOptions.cluster,
+// kustoConnectionOptions.tenantId)
+// val token = deviceAuth.acquireToken()
+// val engineKcsb = ConnectionStringBuilder.createWithAadAccessTokenAuthentication(
+// kustoConnectionOptions.cluster,
+// token)
+// val kustoAdminClient = ClientFactory.createClient(engineKcsb)
+// val df = rows.toDF("name", "value")
+// val conf: Map[String, String] = Map(
+// KustoSinkOptions.KUSTO_TABLE_CREATE_OPTIONS -> SinkTableCreationMode.CreateIfNotExist.toString)
+// df.write.kusto(kustoConnectionOptions.cluster, kustoConnectionOptions.database, table, conf)
+// KustoTestUtils.validateResultsAndCleanup(
+// kustoAdminClient,
+// table,
+// kustoConnectionOptions.database,
+// expectedNumberOfRows,
+// timeoutMs,
+// tableCleanupPrefix = prefix)
+// }
}
diff --git a/connector/src/test/scala/com/microsoft/kusto/spark/KustoBlobAccessE2E.scala b/connector/src/test/scala/com/microsoft/kusto/spark/KustoBlobAccessE2E.scala
index b0083044..1ff4d414 100644
--- a/connector/src/test/scala/com/microsoft/kusto/spark/KustoBlobAccessE2E.scala
+++ b/connector/src/test/scala/com/microsoft/kusto/spark/KustoBlobAccessE2E.scala
@@ -1,19 +1,28 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
-
package com.microsoft.kusto.spark
import com.microsoft.azure.kusto.data.ClientFactory
import com.microsoft.azure.kusto.data.auth.ConnectionStringBuilder
import com.microsoft.kusto.spark.KustoTestUtils.getSystemTestOptions
import com.microsoft.kusto.spark.datasink.KustoSinkOptions
-import com.microsoft.kusto.spark.datasource.{KustoResponseDeserializer, KustoSourceOptions, TransientStorageCredentials, TransientStorageParameters}
+import com.microsoft.kusto.spark.datasource.{
+ KustoResponseDeserializer,
+ KustoSourceOptions,
+ TransientStorageCredentials,
+ TransientStorageParameters
+}
import com.microsoft.kusto.spark.sql.extension.SparkExtension._
import java.util.concurrent.atomic.AtomicInteger
import com.microsoft.kusto.spark.utils.KustoQueryUtils.getQuerySchemaQuery
-import com.microsoft.kusto.spark.utils.{CslCommandsGenerator, KustoBlobStorageUtils, KustoQueryUtils, KustoDataSourceUtils => KDSU}
+import com.microsoft.kusto.spark.utils.{
+ CslCommandsGenerator,
+ KustoBlobStorageUtils,
+ KustoQueryUtils,
+ KustoDataSourceUtils => KDSU
+}
import org.apache.spark.SparkContext
import org.apache.spark.sql.{SQLContext, SparkSession}
import org.scalatest.BeforeAndAfterAll
@@ -94,7 +103,7 @@ class KustoBlobAccessE2E extends AnyFlatSpec with BeforeAndAfterAll {
val myTable = updateKustoTable()
val schema = KustoResponseDeserializer(
kustoAdminClient
- .execute(kustoTestConnectionOptions.database, getQuerySchemaQuery(myTable))
+ .executeMgmt(kustoTestConnectionOptions.database, getQuerySchemaQuery(myTable))
.getPrimaryResults).getSchema
val firstColumn =
@@ -131,7 +140,7 @@ class KustoBlobAccessE2E extends AnyFlatSpec with BeforeAndAfterAll {
Some(partitionPredicate))
val blobs = kustoAdminClient
- .execute(kustoTestConnectionOptions.database, exportCommand)
+ .executeMgmt(kustoTestConnectionOptions.database, exportCommand)
.getPrimaryResults
.getData
.asScala
diff --git a/connector/src/test/scala/com/microsoft/kusto/spark/KustoPruneAndFilterE2E.scala b/connector/src/test/scala/com/microsoft/kusto/spark/KustoPruneAndFilterE2E.scala
index 21fe7d62..faac6b98 100644
--- a/connector/src/test/scala/com/microsoft/kusto/spark/KustoPruneAndFilterE2E.scala
+++ b/connector/src/test/scala/com/microsoft/kusto/spark/KustoPruneAndFilterE2E.scala
@@ -1,7 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
-
package com.microsoft.kusto.spark
import com.microsoft.azure.kusto.data.ClientFactory
@@ -129,7 +128,7 @@ class KustoPruneAndFilterE2E extends AnyFlatSpec with BeforeAndAfterAll {
kustoTestConnectionOptions.cluster,
kustoTestConnectionOptions.accessToken)
val kustoAdminClient = ClientFactory.createClient(engineKcsb)
- kustoAdminClient.execute(
+ kustoAdminClient.executeMgmt(
kustoTestConnectionOptions.database,
generateTempTableCreateCommand(query, columnsTypesAndNames = "ColA:string, ColB:int"))
@@ -226,7 +225,7 @@ class KustoPruneAndFilterE2E extends AnyFlatSpec with BeforeAndAfterAll {
kustoTestConnectionOptions.cluster,
kustoTestConnectionOptions.accessToken)
val kustoAdminClient = ClientFactory.createClient(engineKcsb)
- kustoAdminClient.execute(
+ kustoAdminClient.executeMgmt(
kustoTestConnectionOptions.database,
generateTempTableCreateCommand(query, columnsTypesAndNames = "ColA:string, ColB:int"))
diff --git a/connector/src/test/scala/com/microsoft/kusto/spark/KustoSinkBatchE2E.scala b/connector/src/test/scala/com/microsoft/kusto/spark/KustoSinkBatchE2E.scala
index 8f0f9e14..1be90b91 100644
--- a/connector/src/test/scala/com/microsoft/kusto/spark/KustoSinkBatchE2E.scala
+++ b/connector/src/test/scala/com/microsoft/kusto/spark/KustoSinkBatchE2E.scala
@@ -345,7 +345,7 @@ class KustoSinkBatchE2E extends AnyFlatSpec with BeforeAndAfterAll {
kustoTestConnectionOptions.cluster,
kustoTestConnectionOptions.accessToken)
val kustoAdminClient = ClientFactory.createClient(engineKcsb)
- kustoAdminClient.execute(
+ kustoAdminClient.executeMgmt(
kustoTestConnectionOptions.database,
generateTempTableCreateCommand(table, columnsTypesAndNames = "ColA:string, ColB:int"))
@@ -378,7 +378,7 @@ class KustoSinkBatchE2E extends AnyFlatSpec with BeforeAndAfterAll {
kustoTestConnectionOptions.cluster,
kustoTestConnectionOptions.accessToken)
val kustoAdminClient = ClientFactory.createClient(engineKcsb)
- kustoAdminClient.execute(
+ kustoAdminClient.executeMgmt(
kustoTestConnectionOptions.database,
generateTempTableCreateCommand(table, columnsTypesAndNames = "ColA:string, ColB:int"))
@@ -410,10 +410,10 @@ class KustoSinkBatchE2E extends AnyFlatSpec with BeforeAndAfterAll {
kustoTestConnectionOptions.cluster,
kustoTestConnectionOptions.accessToken)
val kustoAdminClient = ClientFactory.createClient(engineKcsb)
- kustoAdminClient.execute(
+ kustoAdminClient.executeMgmt(
kustoTestConnectionOptions.database,
generateTempTableCreateCommand(table, columnsTypesAndNames = "ColA:string, ColB:int"))
- kustoAdminClient.execute(
+ kustoAdminClient.executeMgmt(
kustoTestConnectionOptions.database,
generateTableAlterStreamIngestionCommand(table))
diff --git a/connector/src/test/scala/com/microsoft/kusto/spark/KustoSinkStreamingE2E.scala b/connector/src/test/scala/com/microsoft/kusto/spark/KustoSinkStreamingE2E.scala
index 647d862f..93e406ad 100644
--- a/connector/src/test/scala/com/microsoft/kusto/spark/KustoSinkStreamingE2E.scala
+++ b/connector/src/test/scala/com/microsoft/kusto/spark/KustoSinkStreamingE2E.scala
@@ -111,7 +111,7 @@ class KustoSinkStreamingE2E extends AnyFlatSpec with BeforeAndAfterAll {
kustoTestConnectionOptions.accessToken)
val kustoAdminClient = ClientFactory.createClient(engineKcsb)
- kustoAdminClient.execute(
+ kustoAdminClient.executeMgmt(
kustoTestConnectionOptions.database,
generateTempTableCreateCommand(table, columnsTypesAndNames = "ColA:string, ColB:int"))
@@ -155,13 +155,13 @@ class KustoSinkStreamingE2E extends AnyFlatSpec with BeforeAndAfterAll {
s"https://${kustoTestConnectionOptions.cluster}.kusto.windows.net",
kustoTestConnectionOptions.accessToken)
val kustoAdminClient = ClientFactory.createClient(engineKcsb)
- kustoAdminClient.execute(
+ kustoAdminClient.executeMgmt(
kustoTestConnectionOptions.database,
generateTempTableCreateCommand(table, columnsTypesAndNames = "ColA:string, ColB:int"))
- kustoAdminClient.execute(
+ kustoAdminClient.executeMgmt(
kustoTestConnectionOptions.database,
generateTableAlterStreamIngestionCommand(table))
- kustoAdminClient.execute(
+ kustoAdminClient.executeMgmt(
kustoTestConnectionOptions.database,
generateClearStreamingIngestionCacheCommand(table))
diff --git a/connector/src/test/scala/com/microsoft/kusto/spark/KustoSourceE2E.scala b/connector/src/test/scala/com/microsoft/kusto/spark/KustoSourceE2E.scala
index 47a43f8c..4f1ef947 100644
--- a/connector/src/test/scala/com/microsoft/kusto/spark/KustoSourceE2E.scala
+++ b/connector/src/test/scala/com/microsoft/kusto/spark/KustoSourceE2E.scala
@@ -1,7 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
-
package com.microsoft.kusto.spark
import com.microsoft.azure.kusto.data.auth.ConnectionStringBuilder
@@ -9,11 +8,24 @@ import com.microsoft.azure.kusto.data.{Client, ClientFactory, ClientRequestPrope
import com.microsoft.kusto.spark.KustoTestUtils.{KustoConnectionOptions, getSystemTestOptions}
import com.microsoft.kusto.spark.authentication.AzureTokenTokenProvider
import com.microsoft.kusto.spark.common.KustoDebugOptions
-import com.microsoft.kusto.spark.datasink.{KustoSinkOptions, SinkTableCreationMode, SparkIngestionProperties}
-import com.microsoft.kusto.spark.datasource.{KustoSourceOptions, ReadMode, TransientStorageCredentials, TransientStorageParameters}
+import com.microsoft.kusto.spark.datasink.{
+ KustoSinkOptions,
+ SinkTableCreationMode,
+ SparkIngestionProperties
+}
+import com.microsoft.kusto.spark.datasource.{
+ KustoSourceOptions,
+ ReadMode,
+ TransientStorageCredentials,
+ TransientStorageParameters
+}
import com.microsoft.kusto.spark.sql.extension.SparkExtension._
import com.microsoft.kusto.spark.utils.CslCommandsGenerator._
-import com.microsoft.kusto.spark.utils.{KustoAzureFsSetupCache, KustoQueryUtils, KustoDataSourceUtils => KDSU}
+import com.microsoft.kusto.spark.utils.{
+ KustoAzureFsSetupCache,
+ KustoQueryUtils,
+ KustoDataSourceUtils => KDSU
+}
import org.apache.hadoop.fs.azurebfs.oauth2.AzureADToken
import org.apache.hadoop.util.ComparableVersion
import org.apache.spark.SparkContext
@@ -45,8 +57,7 @@ class KustoSourceE2E extends AnyFlatSpec with BeforeAndAfterAll {
KustoQueryUtils.simplifyName(s"KustoSparkReadWriteTest_${UUID.randomUUID()}")
private val className = this.getClass.getSimpleName
private lazy val ingestUrl =
- new StringBuffer(KDSU.getEngineUrlFromAliasIfNeeded(kustoConnectionOptions.cluster))
- .toString
+ new StringBuffer(KDSU.getEngineUrlFromAliasIfNeeded(kustoConnectionOptions.cluster)).toString
.replace("https://", "https://ingest-")
private lazy val maybeKustoAdminClient: Option[Client] = Some(
@@ -70,7 +81,7 @@ class KustoSourceE2E extends AnyFlatSpec with BeforeAndAfterAll {
sc = spark.sparkContext
sqlContext = spark.sqlContext
Try(
- maybeKustoAdminClient.get.execute(
+ maybeKustoAdminClient.get.executeMgmt(
kustoConnectionOptions.database,
generateAlterIngestionBatchingPolicyCommand(
"database",
@@ -91,9 +102,8 @@ class KustoSourceE2E extends AnyFlatSpec with BeforeAndAfterAll {
// Remove table if stopping gracefully
maybeKustoAdminClient match {
case Some(kustoAdminClient) =>
- Try(
- kustoAdminClient
- .execute(kustoConnectionOptions.database, generateTableDropCommand(table))) match {
+ Try(kustoAdminClient
+ .executeMgmt(kustoConnectionOptions.database, generateTableDropCommand(table))) match {
case Success(_) => KDSU.logDebug(className, "Ingestion policy applied")
case Failure(e: Throwable) =>
KDSU.reportExceptionAndThrow(
@@ -166,7 +176,7 @@ class KustoSourceE2E extends AnyFlatSpec with BeforeAndAfterAll {
.save()
val instant = Instant.now.plus(1, ChronoUnit.HOURS)
- maybeKustoAdminClient.get.execute(
+ maybeKustoAdminClient.get.executeMgmt(
kustoConnectionOptions.database,
generateTableAlterAutoDeletePolicy(table, instant))
@@ -203,24 +213,27 @@ class KustoSourceE2E extends AnyFlatSpec with BeforeAndAfterAll {
KustoSourceOptions.KUSTO_ACCESS_TOKEN -> kustoConnectionOptions.accessToken)
validateRead(conf)
}
-
"KustoSource" should "execute a read query with transient storage and impersonation in distributed mode" in {
// Use sas delegation to create a SAS key for the test storage
- val sas = KustoTestUtils.generateSasDelegationWithAzCli(kustoConnectionOptions.storageContainerUrl.get)
+ val sas = KustoTestUtils.generateSasDelegationWithAzCli(
+ kustoConnectionOptions.storageContainerUrl.get)
kustoConnectionOptions.storageContainerUrl.get match {
case TransientStorageCredentials.SasPattern(
- storageAccountName, _, domainSuffix, container, _) =>
-
- spark.sparkContext.hadoopConfiguration.set(
- s"fs.azure.sas.$container.$storageAccountName.blob.$domainSuffix",
- sas)
+ storageAccountName,
+ _,
+ domainSuffix,
+ container,
+ _) =>
+ spark.sparkContext.hadoopConfiguration
+ .set(s"fs.azure.sas.$container.$storageAccountName.blob.$domainSuffix", sas)
case _ => throw new InvalidParameterException("Storage url is invalid")
}
// Use impersonation to read to the storage, the identity used for testing should be granted permissions over it
assert(kustoConnectionOptions.storageContainerUrl.get.endsWith(";impersonate"))
val storage =
- new TransientStorageParameters(Array(new TransientStorageCredentials(kustoConnectionOptions.storageContainerUrl.get)))
+ new TransientStorageParameters(
+ Array(new TransientStorageCredentials(kustoConnectionOptions.storageContainerUrl.get)))
val conf: Map[String, String] = Map(
KustoSourceOptions.KUSTO_READ_MODE -> ReadMode.ForceDistributedMode.toString,
@@ -277,7 +290,7 @@ class KustoSourceE2E extends AnyFlatSpec with BeforeAndAfterAll {
// Should take up to another 10 seconds for .show commands to come up
Thread.sleep(5000 * 60)
- val res3 = maybeKustoAdminClient.get.execute(
+ val res3 = maybeKustoAdminClient.get.executeQuery(
s""".show commands | where StartedOn > datetime(${time.toString}) | where
CommandType ==
"DataExportToFile" | where Text has "$table"""")
diff --git a/connector/src/test/scala/com/microsoft/kusto/spark/KustoTestUtils.scala b/connector/src/test/scala/com/microsoft/kusto/spark/KustoTestUtils.scala
index d66becfe..846b5748 100644
--- a/connector/src/test/scala/com/microsoft/kusto/spark/KustoTestUtils.scala
+++ b/connector/src/test/scala/com/microsoft/kusto/spark/KustoTestUtils.scala
@@ -3,20 +3,27 @@
package com.microsoft.kusto.spark
-import com.azure.core.credential.{AccessToken, TokenCredential, TokenRequestContext}
-import com.azure.identity.{AzureCliCredentialBuilder, ClientAssertionCredentialBuilder}
+import com.azure.core.credential.{AccessToken, TokenRequestContext}
+import com.azure.identity.AzureCliCredentialBuilder
import com.azure.storage.blob.BlobServiceClientBuilder
import com.azure.storage.blob.sas.{BlobSasPermission, BlobServiceSasSignatureValues}
import com.microsoft.azure.kusto.data.auth.ConnectionStringBuilder
import com.microsoft.azure.kusto.data.{Client, ClientFactory}
import com.microsoft.kusto.spark.datasink.SinkTableCreationMode.SinkTableCreationMode
-import com.microsoft.kusto.spark.datasink.{KustoSinkOptions, SinkTableCreationMode, SparkIngestionProperties}
+import com.microsoft.kusto.spark.datasink.{
+ KustoSinkOptions,
+ SinkTableCreationMode,
+ SparkIngestionProperties
+}
import com.microsoft.kusto.spark.datasource.{KustoSourceOptions, TransientStorageCredentials}
import com.microsoft.kusto.spark.sql.extension.SparkExtension.DataFrameReaderExtension
-import com.microsoft.kusto.spark.utils.CslCommandsGenerator.{generateDropTablesCommand, generateFindCurrentTempTablesCommand, generateTempTableCreateCommand}
+import com.microsoft.kusto.spark.utils.CslCommandsGenerator.{
+ generateDropTablesCommand,
+ generateFindCurrentTempTablesCommand,
+ generateTempTableCreateCommand
+}
import com.microsoft.kusto.spark.utils.{KustoQueryUtils, KustoDataSourceUtils => KDSU}
import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession}
-import reactor.core.publisher.Mono
import java.security.InvalidParameterException
import java.time.OffsetDateTime
@@ -53,7 +60,7 @@ private[kusto] object KustoTestUtils {
val query = s"$table | count"
while (rowCount < expectedNumberOfRows && timeElapsedMs < timeoutMs) {
- val result = kustoAdminClient.execute(database, query).getPrimaryResults
+ val result = kustoAdminClient.executeQuery(database, query).getPrimaryResults
result.next()
rowCount = result.getInt(0)
Thread.sleep(sleepPeriodMs)
@@ -67,7 +74,7 @@ private[kusto] object KustoTestUtils {
}
tryDropAllTablesByPrefix(kustoAdminClient, database, tableCleanupPrefix)
} else {
- kustoAdminClient.execute(database, generateDropTablesCommand(table))
+ kustoAdminClient.executeMgmt(database, generateDropTablesCommand(table))
}
if (expectedNumberOfRows >= 0) {
@@ -89,13 +96,13 @@ private[kusto] object KustoTestUtils {
database: String,
tablePrefix: String): Unit = {
try {
- val res = kustoAdminClient.execute(
+ val res = kustoAdminClient.executeMgmt(
database,
generateFindCurrentTempTablesCommand(Array(tablePrefix)))
val tablesToCleanup = res.getPrimaryResults.getData.asScala.map(row => row.get(0))
if (tablesToCleanup.nonEmpty) {
- kustoAdminClient.execute(
+ kustoAdminClient.executeMgmt(
database,
generateDropTablesCommand(tablesToCleanup.mkString(",")))
}
@@ -118,7 +125,7 @@ private[kusto] object KustoTestUtils {
kustoConnectionOptions.accessToken)
val kustoAdminClient = ClientFactory.createClient(engineKcsb)
- kustoAdminClient.execute(
+ kustoAdminClient.executeMgmt(
kustoConnectionOptions.database,
generateTempTableCreateCommand(table, targetSchema))
table
@@ -224,13 +231,16 @@ private[kusto] object KustoTestUtils {
}
if (isSourceE2E) {
val storageAccountUrl: String = getSystemVariable("storageAccountUrl")
- cachedToken.put(key, KustoConnectionOptions(cluster, database, accessToken, authority, storageContainerUrl = Some(storageAccountUrl)))
+ cachedToken.put(
+ key,
+ KustoConnectionOptions(
+ cluster,
+ database,
+ accessToken,
+ authority,
+ storageContainerUrl = Some(storageAccountUrl)))
} else {
- cachedToken.put(key, KustoConnectionOptions(
- cluster,
- database,
- accessToken,
- authority))
+ cachedToken.put(key, KustoConnectionOptions(cluster, database, accessToken, authority))
}
cachedToken(key)
}
@@ -254,8 +264,7 @@ private[kusto] object KustoTestUtils {
def generateSasDelegationWithAzCli(storageContainerUrl: String): String = {
val containerName = storageContainerUrl match {
- case TransientStorageCredentials.SasPattern(
- _, _, _, container, _) =>
+ case TransientStorageCredentials.SasPattern(_, _, _, container, _) =>
container
case _ => throw new InvalidParameterException("Storage url is invalid")
}
@@ -269,16 +278,17 @@ private[kusto] object KustoTestUtils {
// Get the user delegation key
val userDelegationKey = blobServiceClient.getUserDelegationKey(
- OffsetDateTime.now(), OffsetDateTime.now().plusHours(1))
+ OffsetDateTime.now(),
+ OffsetDateTime.now().plusHours(1))
val blobSasPermission = new BlobSasPermission()
.setReadPermission(true)
.setWritePermission(true)
.setListPermission(true)
- val sasSignatureValues = new BlobServiceSasSignatureValues(
- OffsetDateTime.now().plusHours(1), blobSasPermission)
- .setStartTime(OffsetDateTime.now().minusMinutes(5))
+ val sasSignatureValues =
+ new BlobServiceSasSignatureValues(OffsetDateTime.now().plusHours(1), blobSasPermission)
+ .setStartTime(OffsetDateTime.now().minusMinutes(5))
containerClient.generateUserDelegationSas(sasSignatureValues, userDelegationKey)
}
diff --git a/pom.xml b/pom.xml
index 11e07d65..944ef3bc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -8,28 +8,18 @@
pom
${revision}
- 5.2.4
-
- 2.12
- 1.1.1640084764.9f463a9
- 17
- 3.0
- 1
-
- 1.2.25
-
- 2.15.2
- 2.15.2
-
+ 6.0.0
8.6.6
- 2.4.10
- 4.13.2
+ 1.2.25
3.17.0
+ 2.16.0
+ 2.16.0
3.4.1
- 5.2.0
1.8
1.8
-
+ 2.4.10
+ 4.13.2
+ 6.0.0
3.10.1
1.4.1
3.3.0
@@ -39,14 +29,17 @@
4.11.0
UTF-8
4.9.1
+ 2.12
+ 17
+ 1.1.1640084764.9f463a9
6.0.0
1.0.0
2.2.0
3.2.17
1.8.0-beta4
+ 3.0
+ 1
3.6.5
- 1.17.2
- 1.14.0
kusto_connector_shaded
@@ -141,12 +134,12 @@
org.scala-lang
scala-rewrites_${scala.version.major}
- 0.1.3
+ 0.1.5
org.typelevel
typelevel-scalafix_${scala.version.major}
- 0.1.4
+ 0.5.0