Как сохранить объект в Ceph Object Store - PullRequest
0 голосов
/ 02 июля 2018

Я развернул кластер Ceph на 3 узлах и создал msd и rgw. У меня есть 3 машины с именами ceph1, ceph2 и ceph3.

  • ceph1 работает с osd, mon, mds и rwg
  • Ceph2 работает OSD
  • Ceph3 работает OSD

Я создал пользователя с помощью команды radosgw-admin user create.

Теперь я хочу получить доступ к кластеру ceph, используя swift api, и создать контейнер. Для этого я написал следующий код Java:

import org.javaswift.joss.client.factory.AccountConfig;
import org.javaswift.joss.client.factory.AccountFactory;
import org.javaswift.joss.client.factory.AuthenticationMethod;
import org.javaswift.joss.model.Account;
import org.javaswift.joss.model.Container;
import org.javaswift.joss.model.StoredObject;
import java.io.File;
import java.io.IOException;
import java.util.*;

public class Example {

public static void main(String[] args) {

    String username = "sahoo";
    String password = "IM8K5GAQIXHFRAKYS761";
    String authUrl  = "http://ceph1:7480/";

    AccountConfig config = new AccountConfig();
    config.setUsername(username);
    config.setPassword(password);
    config.setAuthUrl(authUrl);
    config.setAuthenticationMethod(AuthenticationMethod.BASIC);

    Account account = new AccountFactory(config).createAccount();
    Container container = account.getContainer("container-name");
    container.create();
}
}

Но во время выполнения кода я получаю следующее исключение:

Exception in thread "main" java.lang.NullPointerException
at org.javaswift.joss.command.impl.identity.BasicAuthenticationCommandImpl.getReturnObject(BasicAuthenticationCommandImpl.java:35)
at org.javaswift.joss.command.impl.identity.BasicAuthenticationCommandImpl.getReturnObject(BasicAuthenticationCommandImpl.java:18)
at org.javaswift.joss.command.impl.core.AbstractCommand.call(AbstractCommand.java:51)
at org.javaswift.joss.client.impl.ClientImpl.createAccount(ClientImpl.java:97)
at org.javaswift.joss.client.impl.ClientImpl.createAccount(ClientImpl.java:27)
at org.javaswift.joss.client.core.AbstractClient.authenticate(AbstractClient.java:35)
at org.javaswift.joss.client.factory.AccountFactory.createAccount(AccountFactory.java:30)
at Example.main(Example.java:24)

Может ли кто-нибудь помочь мне с объяснением, почему я получаю исключение и что именно нам нужно передать на config.setAuthUrl().

1 Ответ

0 голосов
/ 29 июля 2018

Прежде всего, вам нужно создать подпользователя для использования swift API.

sudo radosgw-admin subuser create radosgw-admin subuser create --uid={uid} --subuser={uid} --access=[ read | write | readwrite | full ]

REF: http://docs.ceph.com/docs/giant/radosgw/admin/

Чтобы создать подпользователя (интерфейс Swift) для пользователя, вы должны указать идентификатор пользователя (--uid = {имя пользователя}), идентификатор подпользователя и уровень доступа для пользователя.

Затем нам нужно передать URL Ceph RGW на config.setAuthUrl(). Было бы лучше проверить с помощью команды swift быстро.

Например, если вы можете подтвердить создание контейнера с помощью этой команды:

# swift -V 1.0 -A http://ceph.example.com/auth/v1 -U foo:swift -K testsecret post test-container

Затем вы можете указать следующие переменные:

...