Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
5a6356d
azure: support
gkatzioura Nov 6, 2025
93523a2
1311: conventional commit
gkatzioura Nov 6, 2025
9abd71f
1311: delegation token provider
gkatzioura Nov 6, 2025
64dacc8
1311: Added javadoc
gkatzioura Nov 7, 2025
630600f
1311: checkstyle violation fixes
gkatzioura Nov 7, 2025
e5073f2
1311: spotless apply
gkatzioura Nov 7, 2025
6cadc10
1311: removed licenses
gkatzioura Nov 7, 2025
908e8bc
1311: set to CustomTokenProviderAdaptee
gkatzioura Nov 11, 2025
1c7acb3
1311: delegation token receiver plugin
gkatzioura Nov 12, 2025
8fff98b
1311: changed scheme
gkatzioura Nov 12, 2025
5073fa4
1311: added test on obtaining token
gkatzioura Nov 25, 2025
b503da4
1311: added tests on obtaining token
gkatzioura Nov 25, 2025
0d65e46
1311: added tests on token receiver
gkatzioura Nov 25, 2025
e5492fb
1311: added tests on dynamic temporary azure credentials provider
gkatzioura Nov 28, 2025
ae3bd0f
1311: added tests on filesystem
gkatzioura Nov 30, 2025
ac2b0c9
1311: format
gkatzioura Dec 1, 2025
906f9eb
1311: removed variables
gkatzioura Dec 1, 2025
38e5f34
1311: checkstyle fixes
gkatzioura Dec 1, 2025
cd8664a
1311: added abfs file
gkatzioura Dec 1, 2025
a34c1fb
1311: added licenses
gkatzioura Dec 1, 2025
7e4d331
1311: added licenses
gkatzioura Dec 1, 2025
c7cb498
1311: added licenses
gkatzioura Dec 2, 2025
40b2760
1311: added extra formats
gkatzioura Dec 2, 2025
24723eb
fix testing and license issue
polyzos Dec 3, 2025
e83727e
exclude GPC license references
polyzos Dec 3, 2025
8408566
fix license
polyzos Dec 3, 2025
b2f051b
update license
polyzos Dec 3, 2025
290c59d
fix licenseChecker issue
polyzos Dec 3, 2025
34a795b
update NOTICE dependency versions
polyzos Dec 3, 2025
0d2a9bb
fix license jaxb version
polyzos Dec 3, 2025
818ad22
remove .txt file and update NOTICR
polyzos Dec 3, 2025
4fb621d
add both jaxb versions to resolve the error
polyzos Dec 3, 2025
0e9eb21
1311: switched to refresh
gkatzioura Dec 9, 2025
6e7aa91
1311: set delegation token provider to volatile
emmanouil-vega Dec 25, 2025
fe4db3c
1311: use of Collections.singleton
emmanouil-vega Dec 25, 2025
f98c630
1311: removed azureADToken
emmanouil-vega Dec 25, 2025
931578d
1311: setCredentialProvider
emmanouil-vega Dec 25, 2025
6dcb29f
1311: fixed tests
emmanouil-vega Dec 26, 2025
cf21ba7
1311: default to account key
gkatzioura Jan 14, 2026
d0579c1
1311: changed log message
gkatzioura Jan 23, 2026
f033f33
1311: changed comment
gkatzioura Jan 23, 2026
7abac61
1311: removed unnecessary redirect
gkatzioura Jan 23, 2026
1194424
1311: removed unnecessary redirect
gkatzioura Jan 23, 2026
0c687b1
1311: removed region
gkatzioura Jan 23, 2026
10dce90
1311: set to mock auth server
gkatzioura Jan 23, 2026
21b7e10
1311: set as null
gkatzioura Jan 23, 2026
4d4b6d8
1311: added expiration assertion
gkatzioura Jan 23, 2026
62e9f2f
1311: added expiration assertion
gkatzioura Jan 24, 2026
764913f
1311: changed comment to IllegalStateException
gkatzioura Jan 24, 2026
01c3c7e
1311: Renamed to Azure
gkatzioura Jan 26, 2026
6bf27c7
1311: Renamed to azure
gkatzioura Jan 26, 2026
78dbadd
1311: changed to Fluss
gkatzioura Jan 26, 2026
6bc3ec3
1311: changed to Azure
gkatzioura Jan 26, 2026
b074ebc
1311: changed to Azure
gkatzioura Jan 26, 2026
a6428b0
1311: changed to Azure
gkatzioura Jan 26, 2026
c37c64a
1311: added javadoc
gkatzioura Jan 26, 2026
f76c376
1311: exposing only fs.azure
gkatzioura Jan 26, 2026
bee32a8
1311: removed exclusion
gkatzioura Jan 26, 2026
1c4aecd
1311: switched to fluss-fs-hadoop-shaded
gkatzioura Jan 26, 2026
e01d308
1311: switched to AzureFileSystemPlugin class
gkatzioura Jan 26, 2026
8e0a4b8
1311: switched to AzureFileSystemPlugin class
gkatzioura Jan 26, 2026
6421b4a
1311: added license
gkatzioura Jan 26, 2026
47323e6
1311: created abstract SecurityTokenReceiver class
gkatzioura Jan 26, 2026
e68a686
1311: fixed imports
gkatzioura Jan 26, 2026
add3b07
1311: revert due to java.lang.NoClassDefFoundError: org/apache/hadoop…
gkatzioura Jan 26, 2026
34c1faa
1311: added receiver plugins
gkatzioura Jan 26, 2026
8277edb
extract options and add tests to satisfy coverage
polyzos Jan 26, 2026
01e0a06
fix checkstyle violations
polyzos Jan 26, 2026
b94cdbf
use fluss-fs-hadoop-shaded
wuchong Jan 27, 2026
a30a231
fix doc
wuchong Jan 27, 2026
1cb4468
fix NOTICE and LICENSE
wuchong Jan 27, 2026
c9ee332
fix NOTICE
wuchong Jan 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
234 changes: 234 additions & 0 deletions fluss-filesystems/fluss-fs-azure/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,234 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License 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.
-->

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.fluss</groupId>
<artifactId>fluss-filesystems</artifactId>
<version>0.9-SNAPSHOT</version>
</parent>

<artifactId>fluss-fs-azure</artifactId>
<name>Fluss : FileSystems : Azure FS</name>

<packaging>jar</packaging>

<properties>
<fs.azure.sdk.version>3.3.4</fs.azure.sdk.version>
<fs.azure.api.version>1.16.0</fs.azure.api.version>
</properties>

<dependencies>
<dependency>
<groupId>org.apache.fluss</groupId>
<artifactId>fluss-common</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>

<!-- The Hadoop file system adapter classes (bundled) -->
<dependency>
<groupId>org.apache.fluss</groupId>
<artifactId>fluss-fs-hadoop</artifactId>
<version>${project.version}</version>
</dependency>

<dependency>
<groupId>org.apache.fluss</groupId>
<artifactId>fluss-fs-hadoop-shaded</artifactId>
<version>${project.version}</version>
</dependency>

<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-azure</artifactId>
<version>${fs.hadoopshaded.version}</version>
<exclusions>
<exclusion>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure</artifactId>
</exclusion>
<exclusion>
<!-- provided by fluss-fs-hadoop-shaded -->
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
</exclusion>
<exclusion>
<groupId>ch.qos.reload4j</groupId>
<artifactId>reload4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-reload4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure</artifactId>
<version>${fs.azure.api.version}</version>
<scope>test</scope>
</dependency>
<!-- for the behavior test suite -->
<dependency>
<groupId>org.apache.fluss</groupId>
<artifactId>fluss-common</artifactId>
<version>${project.version}</version>
<scope>test</scope>
<type>test-jar</type>
</dependency>
<dependency>
<groupId>org.apache.fluss</groupId>
<artifactId>fluss-test-utils</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>

</dependencies>


<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifestEntries>
<!-- jaxb-api is packaged as an optional dependency that is only accessible on Java 11 -->
<Multi-Release>true</Multi-Release>
</manifestEntries>
</archive>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-javax-jars</id>
<phase>process-resources</phase>
<goals>
<goal>copy</goal>
</goals>
</execution>
</executions>
<configuration>
<artifactItems>
<artifactItem>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>${jaxb.api.version}</version>
<type>jar</type>
<overWrite>true</overWrite>
</artifactItem>
</artifactItems>
<outputDirectory>${project.build.directory}/temporary</outputDirectory>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>unpack-javax-libraries</id>
<phase>process-resources</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<echo message="unpacking javax jars"/>
<unzip dest="${project.build.directory}/classes/META-INF/versions/11">
<fileset dir="${project.build.directory}/temporary">
<include name="*"/>
</fileset>
</unzip>
</target>
</configuration>
</execution>
</executions>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<id>shade-fluss</id>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<includes>
<include>*:*</include>
</includes>
</artifactSet>
<filters>
<filter>
<artifact>*</artifact>
<excludes>
<exclude>.gitkeep</exclude>
<exclude>mime.types</exclude>
<exclude>mozilla/**</exclude>
<exclude>META-INF/maven/**</exclude>
<exclude>META-INF/LICENSE.txt</exclude>
</excludes>
</filter>
<filter>
<artifact>org.apache.fluss:fluss-fs-hadoop</artifact>
<excludes>
<exclude>META-INF/**</exclude>
</excludes>
</filter>
<filter>
<artifact>*</artifact>
<excludes>
<exclude>properties.dtd</exclude>
<exclude>PropertyList-1.0.dtd</exclude>
<exclude>META-INF/services/javax.xml.stream.*</exclude>
<exclude>META-INF/LICENSE.txt</exclude>
<!-- Remove files tripping CI forbidden GPL regex in transitive deps -->
<exclude>com/sun/xml/bind/**/Messages.properties</exclude>
<exclude>com/sun/jersey/json/impl/impl.properties</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License 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 org.apache.fluss.fs.azure;

/**
* FileSystem plugin for Azure Blob Storage using the ABFS (Azure Blob File System) driver.
* Registered for the {@code abfs://} scheme.
*
* <p>ABFS is the recommended driver for accessing Azure Data Lake Storage Gen2. Use this scheme for
* non-SSL connections to ADLS Gen2 storage accounts.
*
* <p>URI format: {@code abfs://<container>@<storage-account>.dfs.core.windows.net/<path>}
*/
public class AbfsFileSystemPlugin extends AzureFileSystemPlugin {

@Override
public String getScheme() {
return "abfs";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License 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 org.apache.fluss.fs.azure;

/**
* FileSystem plugin for Azure Blob Storage using the ABFS driver with SSL/TLS encryption.
* Registered for the {@code abfss://} scheme.
*
* <p>This is the secure (SSL-enabled) variant of ABFS, recommended for production use with Azure
* Data Lake Storage Gen2.
*
* <p>URI format: {@code abfss://<container>@<storage-account>.dfs.core.windows.net/<path>}
*/
public class AbfssFileSystemPlugin extends AzureFileSystemPlugin {

@Override
public String getScheme() {
return "abfss";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License 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 org.apache.fluss.fs.azure;

import org.apache.fluss.config.Configuration;
import org.apache.fluss.fs.FileSystem;
import org.apache.fluss.fs.azure.token.AzureDelegationTokenProvider;
import org.apache.fluss.fs.hdfs.HadoopFileSystem;
import org.apache.fluss.fs.token.ObtainedSecurityToken;

import java.io.IOException;

/**
* Implementation of the Fluss {@link FileSystem} interface for Azure Blob Storage. This class
* implements the common behavior implemented directly by Fluss and delegates common calls to an
* implementation of Hadoop's filesystem abstraction.
*/
public class AzureFileSystem extends HadoopFileSystem {

private final String scheme;
private final Configuration conf;

private volatile AzureDelegationTokenProvider delegationTokenProvider;

/**
* Wraps the given Hadoop File System object as a Fluss File System object. The given Hadoop
* file system object is expected to be initialized already.
*
* @param hadoopFileSystem The Hadoop FileSystem that will be used under the hood.
*/
public AzureFileSystem(
String scheme, org.apache.hadoop.fs.FileSystem hadoopFileSystem, Configuration conf) {
super(hadoopFileSystem);
this.scheme = scheme;
this.conf = conf;
}

@Override
public ObtainedSecurityToken obtainSecurityToken() throws IOException {
if (delegationTokenProvider == null) {
synchronized (this) {
if (delegationTokenProvider == null) {
delegationTokenProvider = new AzureDelegationTokenProvider(scheme, conf);
}
}
}

return delegationTokenProvider.obtainSecurityToken();
}
}
Loading