Updated on 2024-03-05 GMT+08:00

Creating a File System

Scenarios

A file system is a container that store files in SFS. You need to create a file system before storing data in SFS.

The following describes how to call the API for Creating a File System in a region. For details, see Calling APIs (SFS 3.0 Capacity-Oriented).

Prerequisites

Once a region is determined, it cannot be modified after the bucket is created.

Creating a File System Named filesystem001 in the a1 Region

In this example, an Apache HttpClient is used.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
package com.sfsclient;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;

public class TestMain {
    // Obtain an AK/SK pair using environment variables or import it in other ways. Using hard coding may result in leakage.
    // Obtain an AK/SK pair on the management console.
    public static String accessKey = System.getenv("HUAWEICLOUD_SDK_AK");
    public static String securityKey = System.getenv("HUAWEICLOUD_SDK_SK"); 
    public static String region = "cn-east-3"; // The region where you plan to create the file system.

    public static String endpoint = "sfs3.a1.region.com"; // The network address of SFS 3.0.
    
    public static String createSfsBody =
            "<CreateBucketConfiguration >\n" +
                    "<Location>" + region + "</Location>\n" +
                    "</CreateBucketConfiguration>";

    public static void main(String[] str) {

        createFileSystem();

    }
    private static void createFileSystem() {
        // The file system name.
        String fileSystemName = "example-sfs-001";

        String httpMethod = "PUT";
        String date = DateUtils.formatDate(System.currentTimeMillis());
        String contentType = "application/xml";

        /**Calculate the signature based on the request.**/
        String contentMD5 = "";
        String canonicalizedHeaders = "x-obs-bucket-type:SFS";
        String canonicalizedResource = "/" + fileSystemName ;

        // Content-MD5 and Content-Type fields do not contain line breaks. The data format is RFC 1123, which is the same as the time in the request.
        String stringToSign = httpMethod + "\n" +
                contentMD5 + "\n" +
                contentType + "\n" +
                date + "\n" +
                canonicalizedHeaders  + "\n" + canonicalizedResource;

        System.out.printf("StringToSign:\n[%s]\n\n", stringToSign);

        HttpURLConnection conn = null;

        try {
            String signature = Signature.signWithHmacSha1(securityKey, stringToSign);
            String authorization= "OBS " + accessKey + ":" + signature;
            System.out.printf("authorization:%s\n\n", authorization);

            URL url = new URL("http://" + endpoint + "/" + fileSystemName);
            conn = (HttpURLConnection) url.openConnection();

            // Add a signature header.
            conn.setRequestMethod(httpMethod);
            conn.setRequestProperty("Date", date);
            conn.setRequestProperty("Content-Type", contentType);
            conn.setRequestProperty("x-obs-bucket-type", "SFS");
            conn.setRequestProperty("Authorization", authorization);
            conn.setDoOutput(true);

            // Add a body.
            OutputStream out = conn.getOutputStream();
            out.write(createSfsBody.getBytes());
            out.flush();
            out.close();

            String status = conn.getHeaderField(null);
            System.out.println(status);

            // Output the response message.
            Map<String, List<String>> headers = conn.getHeaderFields();
            for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
                String key = entry.getKey();
                List<String> values = entry.getValue();
                if (key != null) {
                    for (String value : values) {
                        System.out.println(key + ": " + value);
                    }
                }
            }
            // Handle the request error.
            int statusCode = conn.getResponseCode();
            if (statusCode != HttpURLConnection.HTTP_OK && statusCode != HttpURLConnection.HTTP_NO_CONTENT) {
                InputStream errorStream = conn.getErrorStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(errorStream));
                StringBuilder responseBody = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    responseBody.append(line);
                }
                reader.close();

                System.out.println("Error: " + responseBody);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (conn != null){
                conn.disconnect();
            }
        }
    }
}

The format of the Date header field DateUtils is as follows:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
package com.sfsclient;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.TimeZone;

public class DateUtils {

    public static String formatDate(long time)
    {
        DateFormat serverDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH);
        serverDateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
        return serverDateFormat.format(time);
    }
}

The method of calculating the signature character string is as follows:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.sfsclient;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;
import java.util.Base64;

public class Signature {
    public static String signWithHmacSha1(String sk, String canonicalString) throws UnsupportedEncodingException {

        try {
            SecretKeySpec signingKey = new SecretKeySpec(sk.getBytes("UTF-8"), "HmacSHA1");
            Mac mac = Mac.getInstance("HmacSHA1");
            mac.init(signingKey);
            return Base64.getEncoder().encodeToString(mac.doFinal(canonicalString.getBytes("UTF-8")));
        } catch (NoSuchAlgorithmException | InvalidKeyException | UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }
}