получает serviceInstanceName и serviceKeyName для обслуживания поставщика пользователей cloud foundry с помощью cloudFoundryOperations

#cloud-foundry #cloudfoundry-java-client

#cloud-foundry #cloudfoundry-java-client

Вопрос:

я пытаюсь получить учетные данные ИБП в cloud foundry: используя:

 Mono<ServiceKey> serviceKey = (Mono<ServiceKey>) cloudFoundryOperations
    .services()
    .getServiceKey(
        GetServiceKeyRequest.builder()
            .serviceKeyName("digital_cassandra")
            .serviceInstanceName("2a5aa377-e992-4f88-9f85-d9cec5c3bea9")
            .build())
    .subscribe();

serviceKey.map(serviceKey1 -> {
    System.out.println(serviceKey1.getCredentials().toString());
    return serviceKey1.getCredentials().get(0);
}); 
  

но ничего не напечатано.
как указать serviceKeyName и serviceInstanceName с помощью cloudFoundryOperations?
мне нужно распечатать все serviceKeyName и serviceInstanceName в моем пространстве.

Ответ №1:

.serviceInstanceName(«2a5aa377-e992-4f88-9f85-d9cec5c3bea9»)

Это должно быть фактическое имя, а не идентификатор guid. Например, «my-key» или как бы вы ни называли свой ключ.

но ничего не напечатано. как указать serviceKeyName и serviceInstanceName с помощью cloudFoundryOperations?

Если вы просто хотите выполнить печать на консоли, попробуйте что-то вроде этого:

         cloudFoundryOperations
            .services()
            .getServiceKey(GetServiceKeyRequest.builder()
                    .serviceInstanceName("reservation-db")
                    .serviceKeyName("cf-mysql")
                    .build())
            .doOnNext(key -> {
                System.out.println("Key:");
                System.out.println("  "   key.getName()   " ("   key.getId()   ")");
                key.getCredentials().forEach((k, v) -> {
                    System.out.println("    "   k   " => "   v);
                });
            })
            .block();
  

GetServiceKeyRequest определяет, какой служебный ключ ищется. doOnNext Вызов позволяет проверять, но не использовать ключ, который отлично работает для его распечатки. Затем в примере вызывается .block() ожидание результатов, что нормально, потому что это всего лишь пример. Однако вы не хотели бы делать это в своем реальном коде. Вероятно, вам понадобится один из subscribe() вариантов (вы subscribe() тоже можете поменять doOnNext() местами, просто зависит от того, что вы делаете в коде).

мне нужно распечатать все serviceKeyName и serviceInstanceName в моем пространстве.

Для получения всех ключей для всех экземпляров службы:

        cloudFoundryOperations
           .services()
           .listInstances()
           .doOnNext(si -> {
               System.out.println("  "   si.getName()   "  ("   si.getId()   ")");
           })
           .flatMap((ServiceInstanceSummary si) -> {
                return ops
                      .services()
                      .listServiceKeys(ListServiceKeysRequest.builder()
                              .serviceInstanceName(si.getName())
                              .build())
                      .doOnNext(key -> {
                            System.out.println("Key:");
                            System.out.println("  "   key.getName()   " ("   key.getId()   ")");
                            key.getCredentials().forEach((k, v) -> {
                                System.out.println("    "   k   " => "   v);
                            });
                      });
           })
           .blockLast();
  

Этот клиент перечисляет все экземпляры службы, печатает имя / идентификатор, а затем использует flatMap для выхода и получения служебных ключей для каждого экземпляра службы. Затем он объединяет их все в один Flux<ServiceKey> . Это doOnNext() только для печати. Вам не обязательно это делать. Вы можете использовать результат несколькими способами, например, собрать его в список или подписаться на него, это просто хорошо работает для примера. Используйте то, что лучше всего подходит для вашего кода.