Как подготовить эмулятор Pub / Sub к тестам? - PullRequest
0 голосов
/ 05 марта 2019

Я запускаю gcloud SDK Docker

docker run -ti --rm --expose=8085 -p 8085:8085 google/cloud-sdk:latest

тогда я бегу:

gcloud beta emulators pubsub start --project=my-project  --host-port=0.0.0.0:8085

затем остановите сервер и затем:

gcloud beta emulators pubsub env-init

дает:

export PUBSUB_EMULATOR_HOST = 0.0.0.0: 8085

но нет идентификатора проекта. Как я могу настроить проект для тестов? Как я могу создавать темы и подписки?

версия:

gcloud  version

дает:

Google Cloud SDK 236.0.0
...
pubsub-emulator 2019.02.22

1 Ответ

0 голосов
/ 05 марта 2019

Вы запускаете эмулятор pubsub с проектом my-project в вашей второй команде.Как только это запустится, не убивайте его, оставьте его работающим.

Для создания тем и подписок необходимо использовать один из SDK.Я создал демонстрационный проект, который делает это, используя Java SDK: https://github.com/nhartner/pubsub-emulator-demo/

Соответствующий код:

@Component
public class TestPubSubConfig {

    private final TransportChannelProvider channelProvider;
    private final CredentialsProvider credentialsProvider;

    private String projectId;
    private String topicName = "test-topic";
    private String subscriptionName = "test-subscription";

    TestPubSubConfig(@Autowired @Value("${spring.cloud.gcp.pubsub.emulator-host}") String emulatorHost,
                     @Autowired @Value("${spring.cloud.gcp.project-id}") String projectId) throws IOException {
        this.projectId = projectId;
        ManagedChannel channel = ManagedChannelBuilder.forTarget(emulatorHost).usePlaintext().build();
        channelProvider = FixedTransportChannelProvider.create(GrpcTransportChannel.create(channel));
        credentialsProvider = NoCredentialsProvider.create();
        createTopic(topicName);
        createSubscription(topicName, subscriptionName);
    }

    @Bean
    public Publisher testPublisher() throws IOException {
        return Publisher.newBuilder(ProjectTopicName.of(projectId, topicName))
                .setChannelProvider(channelProvider)
                .setCredentialsProvider(credentialsProvider)
                .build();
    }

    private void createSubscription(String topicName, String subscriptionName) throws IOException {
        ProjectTopicName topic = ProjectTopicName.of(projectId, topicName);
        ProjectSubscriptionName subscription = ProjectSubscriptionName.of(projectId, subscriptionName);

        try {
            subscriptionAdminClient()
                    .createSubscription(subscription, topic, PushConfig.getDefaultInstance(), 100);
        }
        catch (AlreadyExistsException e) {
            // this is fine, already created
        }
    }

    private void createTopic(String topicName) throws IOException {
        ProjectTopicName topic = ProjectTopicName.of(projectId, topicName);
        try {
            topicAdminClient().createTopic(topic);
        }
        catch (AlreadyExistsException e) {
            // this is fine, already created
        }
    }

    private TopicAdminClient topicAdminClient() throws IOException {
        return TopicAdminClient.create(
                TopicAdminSettings.newBuilder()
                        .setTransportChannelProvider(channelProvider)
                        .setCredentialsProvider(credentialsProvider).build());
    }


    private SubscriptionAdminClient subscriptionAdminClient() throws IOException {
        return SubscriptionAdminClient.create(SubscriptionAdminSettings.newBuilder()
                .setTransportChannelProvider(channelProvider)
                .setCredentialsProvider(credentialsProvider)
                .build());

    }

}
...