Учетные данные для HTTP-запросов из встроенной среды выполнения Apama в Cumulocity - PullRequest
2 голосов
/ 20 мая 2019

Я использую Apama v10.3.1.Я использую встроенный контейнер Apama установки Cumulocity, и все, что я загружаю, - это монитор, а не весь проект Apama.В моем мониторе Apama я выполняю HTTP-запрос GET к API-интерфейсу Cumulocity REST для получения дополнительных параметров, необходимых для обработки моего монитора.

Моя проблема заключается в том, что при выполнении HTTP-запроса мне нужно предоставить пользователю ипароль, в противном случае я получаю 401 ошибку.Поскольку я не хочу жестко кодировать имя пользователя и пароль на моем мониторе, есть ли способ использовать учетные данные, которые встроенный контейнер Apama использует для связи с Cumulocity?Поскольку Apama общается с Cumulocity для обмена событиями, измерениями и т. Д., Я предполагаю, что где-то есть учетные данные.Так ли это, и если да, как я могу сказать моему монитору Apama использовать эти учетные данные?

Вот фрагмент кода:

monitor SampleAlarmRules {

    action onload() {

        monitor.subscribe(Alarm.CHANNEL);
        monitor.subscribe(FindManagedObjectResponse.CHANNEL);

        on all Alarm(type = "ax_UnavailabilityAlarm") as a {
        onAlarm(a.source);

        }

    }

    action onAlarm(string source) {

        integer reqId := integer.getUnique();
        send FindManagedObject(reqId, source, new dictionary<string,string>) to FindManagedObject.CHANNEL;
        on FindManagedObjectResponse(reqId = reqId) as resp
           and not FindManagedObjectResponseAck(reqId) {
            ManagedObject dev := resp.managedObject;

            dictionary<string, string> httpConfig := {
                HttpTransport.CONFIG_AUTH_TYPE:"HTTP_BASIC"
                //HttpTransport.CONFIG_USERNAME:"someUser",
                //HttpTransport.CONFIG_PASSWORD:"somePassword"
            };

            HttpTransport httpTransport := HttpTransport.getOrCreateWithConfigurations("someBaseUrl", 80, httpConfig);
            Request request := httpTransport.createGETRequest("/inventory/managedObjects/5706999?withParents=true");
            request.execute(handleResponse);

        }
    }

    action handleResponse(Response response) {
        JSONPlugin json := new JSONPlugin;
        if response.isSuccess(){
            switch (response.payload.data as payload) {
                case string: {                    
                }
                default: { 
                }
            }           
        }

        else {
            print "###Request failed. Response status is: " + response.statusCode.toString() + " | " + response.statusMessage;
        }
    }
}

При такой конфигурации (пользователь и пароль)прокомментировал) Я получил следующее заявление печати:

Запрос не выполнен.Статус ответа: 401 |Несанкционированный

При включении пользователя и пароля запрос выполняется успешно.Однако я не хочу здесь жестко кодировать пользователя и пароль.

Кроме того, есть ли способ получить текущего арендатора из переменной окружения или чего-либо подобного, чтобы мне не пришлось усерднозакодировать базовый URL?

Спасибо, Матиас

1 Ответ

3 голосов
/ 20 мая 2019

Да, это можно сделать, потому что Cumulocity передает их как переменные среды всем микросервисам, включая микросервис Apama.

Вы должны иметь возможность использовать событие com.apama.correlator.Component для доступа к переменным среды.Используйте Component.getInfo("envp"), чтобы получить словарь свойств среды, а затем ищите заинтересованные переменные.Вы можете увидеть список переменных среды в http://www.cumulocity.com/guides/reference/microservice-runtime/#environment-variables

Так что для вашего варианта использования будет работать что-то вроде следующего:

using com.apama.correlator.Component;
...
monitor test {
    action onload() {
        dictionary<string,string> envp := Component.getInfo("envp");
        dictionary<string, string> httpConfig := {
            HttpTransport.CONFIG_AUTH_TYPE:"HTTP_BASIC",
            HttpTransport.CONFIG_USERNAME:envp["C8Y_USER"],
            HttpTransport.CONFIG_PASSWORD:envp["C8Y_PASSWORD"]
        };

        HttpTransport httpTransport := HttpTransport.getOrCreateWithConfigurations("someBaseUrl", 80, httpConfig);
            Request request := httpTransport.createGETRequest("/inventory/managedObjects/5706999?withParents=true");
            request.execute(handleResponse);
    }
}

Аналогично, вы можете получить доступ к имени арендатора, используя переменную среды C8Y_TENANT.

Обратите внимание, что эти переменные среды доступны только в облаке.Если вы хотите сделать то же самое или протестировать код локально, когда используете его с транспортом Cumulocity, добавленным вами самостоятельно, без изменения кода, вы можете вручную определить те же переменные среды в конфигурации прогона Designer, чтобы они также были доступны там..

...