CF连接到云控制器

时间:2017-01-04 12:12:35

标签: javascript node.js ibm-cloud cloudfoundry pivotal-cloud-foundry

我使用以下lib连接到云控制器

https://github.com/prosociallearnEU/cf-nodejs-client

const endpoint = "https://api.mycompany.com/";
const username = "myuser";
const password = "mypass";

const CloudController = new (require("cf-client")).CloudController(endpoint);
const UsersUAA = new (require("cf-client")).UsersUAA;
const Apps = new (require("cf-client")).Apps(endpoint);

CloudController.getInfo().then((result) => {
    UsersUAA.setEndPoint(result.authorization_endpoint);
    return UsersUAA.login(username, password);
}).then((result) => {
    Apps.setToken(result);
    return Apps.getApps();
}).then((result) => {
    console.log(result);
}).catch((reason) => {
    console.error("Error: " + reason);
});
  1. 我尝试针对我们的API运行它并且它无法工作,我在控制台中没有收到任何错误消息,它可以是什么?

  2. 这里处理空间/组织的位置是什么?因为当我从cli连接时,它会问我要连接哪个空间/组织...

  3. 我能够通过CLI登录,只需从代码我无法,任何想法在这里缺少什么?

    我运行它时的问题我没有得到任何有助于理解根本原因的错误

2 个答案:

答案 0 :(得分:4)

我克隆了原始的git存储库并修改了一些支持代理的方法。请注意,我只修改了一些方法以使示例代码正常工作,但需要完整的包重构。

基本上你需要做的是在调用proxy方法之前添加一个request参数(这是在整个包中完成的,因此需要进行一些修改),例如这是一个Organization.js文件中的方法:

getSummary (guid) {

        const url = `${this.API_URL}/v2/organizations/${guid}/summary`;
        const proxy = `${this.API_PROXY}`;
        const options = {
            method: "GET",
            url: url,
            proxy: proxy,
            headers: {
                Authorization: `${this.UAA_TOKEN.token_type} ${this.UAA_TOKEN.access_token}`
            }
        };

        return this.REST.request(options, this.HttpStatus.OK, true);
    }

您可以在下面的git存储库中找到我的更改:

https://github.com/adasilva70/cf-nodejs-client.git

我还在下面创建了一个新示例。此示例列出了用户的所有组织,获取了返回的第一个组织并列出了其空间。您可以修改代码以提供与cf login提供的类似功能(允许您选择组织,然后选择空格)。

const endpoint = "https://api.mycompany.com/";
const username = "youruser";
const password = "yourpassword";
const proxy = "http://proxy.mycompany.com:8080";

const CloudController = new (require("cf-nodejs-client")).CloudController(endpoint, proxy);
const UsersUAA = new (require("cf-nodejs-client")).UsersUAA;
const Apps = new (require("cf-nodejs-client")).Apps(endpoint, proxy);
const Orgs = new (require("cf-nodejs-client")).Organizations(endpoint, proxy);

CloudController.getInfo().then((result) => {
    console.log(result);
    UsersUAA.setEndPoint(result.authorization_endpoint, proxy);
    return UsersUAA.login(username, password);
}).then((result) => {
    //Apps.setToken(result);
    //return Apps.getApps();
    Orgs.setToken(result);
    return Orgs.getOrganizations();
}).then((result) => {
    console.log(result);
    org_guid = result.resources[1].metadata.guid;
    return Orgs.getSummary(org_guid);
}).then((result) => {
    console.log(result);
}).catch((reason) => {
    console.error("Error: " + reason);
});

我做了一些小测试以确保样品正常工作,所以请小心使用。此外,更改仅适用于现在需要代理的情况。

答案 1 :(得分:2)

图书馆github网站上的第一件事就是警告:

  

注意:此软件包还没有为生产应用程序做好准备。

似乎项目没有得到维护,因为有很多门票已经有几个月没有响应了。

无论如何,要弄清楚为什么库不工作并且不产生错误消息,我会查看库源代码并添加一些控制台日志记录语句,可能从HttpUtils开始。例如:

requestWithDefaults(options, function (error, response, body) {
    console.log("requestWithDefaults error: ", error)
    console.log("requestWithDefaults response: ", response)
    console.log("requestWithDefaults body: ", body)
    ...
}

或者,您可以尝试通过使用nodejs debugger向requestWithDefaults和库中的其他关键位置添加断点来调试代码。

您也可以尝试调试类似于此how to monitor the network on node.js similar to chrome/firefox developer tools?

的网络调用

要了解如何使用该库,我将查看tests文件夹并查找与您的用例类似的测试。如果在test/lib/model/cloudcontroller文件夹中看起来有用的测试,则有合理的数量。

关于空格的问题,我找到了一个example,你可以在其中传入一个空间guid来返回该空间guid的应用程序。

CloudFoundrySpaces.getSpaceApps(space_guid, filter).then( ... )

我假设您正在使用的电话App.getApps()将返回所有空间/组织的应用。