@itentialopensource/adapter-openstack_glance 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,4 +1,12 @@
1
1
 
2
+ ## 0.8.0 [02-13-2026]
3
+
4
+ * minor/auto-migrate/20260213-110756
5
+
6
+ See merge request itentialopensource/adapters/adapter-openstack_glance!29
7
+
8
+ ---
9
+
2
10
  ## 0.3.4 [10-15-2024]
3
11
 
4
12
  * Changes made at 2024.10.14_19:55PM
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@itentialopensource/adapter-openstack_glance",
3
- "version": "0.7.1",
3
+ "version": "0.8.0",
4
4
  "description": "This adapter integrates with system described as: Openstack Image (Glance) Service",
5
5
  "main": "adapter.js",
6
6
  "systemName": "OpenStack Glance",
7
- "wizardVersion": "3.8.0",
8
- "engineVersion": "1.80.0",
7
+ "wizardVersion": "3.12.1",
8
+ "engineVersion": "1.82.5",
9
9
  "adapterType": "http",
10
10
  "scripts": {
11
11
  "preinstall": "node utils/setup.js",
@@ -39,8 +39,8 @@
39
39
  ],
40
40
  "license": "Apache-2.0",
41
41
  "engines": {
42
- "node": ">= 14.0.0",
43
- "npm": ">= 6.0.0"
42
+ "node": ">= 18.18.0",
43
+ "npm": ">= 9.8.1"
44
44
  },
45
45
  "repository": {
46
46
  "type": "git",
@@ -49,14 +49,14 @@
49
49
  "author": "Itential",
50
50
  "homepage": "https://gitlab.com/itentialopensource/adapters/adapter-openstack_glance#readme",
51
51
  "dependencies": {
52
- "@itentialopensource/adapter-utils": "6.1.7",
52
+ "@itentialopensource/adapter-utils": "6.1.14",
53
53
  "acorn": "8.14.1",
54
54
  "ajv": "8.17.1",
55
- "axios": "1.12.2",
55
+ "axios": "1.13.5",
56
56
  "commander": "11.1.0",
57
57
  "fs-extra": "11.3.0",
58
58
  "json-query": "2.2.2",
59
- "mocha": "10.8.2",
59
+ "mocha": "11.3.0",
60
60
  "mocha-param": "2.0.1",
61
61
  "mongodb": "4.17.2",
62
62
  "ping": "0.4.4",
@@ -66,7 +66,7 @@
66
66
  "boolean",
67
67
  "string"
68
68
  ],
69
- "description": "When true the metrics collected by the adapter will be stored in mongo or on the filesystem",
69
+ "description": "When true the metrics collected by the adapter will be stored in mongo or in the adapter. If a full path is provided, metrics will be saved in the path provided.",
70
70
  "default": false
71
71
  },
72
72
  "stub": {
@@ -480,7 +480,7 @@
480
480
  "type": "integer",
481
481
  "description": "How often the healthcheck should run (in milliseconds).",
482
482
  "default": 300000,
483
- "minimum": 60000,
483
+ "minimum": 30000,
484
484
  "maximum": 3600000
485
485
  },
486
486
  "protocol": {
@@ -718,9 +718,10 @@
718
718
  },
719
719
  "keep_alive_interval": {
720
720
  "type": "integer",
721
- "description": "TCP keep-alive interval in seconds for long-lived connections. Set to 0 to disable (default). Minimum 30 seconds when enabled.",
721
+ "description": "TCP keep-alive interval in milliseconds to prevent connection timeout during long-running requests. 0 = disabled (default). Minimum value when enabled is 30000ms (30 seconds). Values below 30000ms will be auto-corrected to 30000ms with a warning.",
722
722
  "default": 0,
723
- "minimum": 0
723
+ "minimum": 0,
724
+ "maximum": 3600000
724
725
  }
725
726
  },
726
727
  "required": [
@@ -1132,7 +1133,7 @@
1132
1133
  },
1133
1134
  "requestFields": {
1134
1135
  "type": "object",
1135
- "description": "The json object with response fields of the call to getDevice",
1136
+ "description": "The json object with request fields of the call to getDevice",
1136
1137
  "additionalProperties": {
1137
1138
  "type": [
1138
1139
  "string",
@@ -1275,7 +1276,7 @@
1275
1276
  },
1276
1277
  "requestFields": {
1277
1278
  "type": "object",
1278
- "description": "The json object with response fields of the call to getDevice",
1279
+ "description": "The json object with request fields of the call to getDevice",
1279
1280
  "additionalProperties": {
1280
1281
  "type": [
1281
1282
  "string",
@@ -1386,7 +1387,7 @@
1386
1387
  },
1387
1388
  "requestFields": {
1388
1389
  "type": "object",
1389
- "description": "The json object with response fields of the call to getDevice",
1390
+ "description": "The json object with request fields of the call to getDevice",
1390
1391
  "additionalProperties": {
1391
1392
  "type": [
1392
1393
  "string",
@@ -1482,7 +1483,7 @@
1482
1483
  },
1483
1484
  "requestFields": {
1484
1485
  "type": "object",
1485
- "description": "The json object with response fields of the call to getDevice",
1486
+ "description": "The json object with request fields of the call to getDevice",
1486
1487
  "additionalProperties": {
1487
1488
  "type": [
1488
1489
  "string",
@@ -1567,7 +1568,7 @@
1567
1568
  },
1568
1569
  "requestFields": {
1569
1570
  "type": "object",
1570
- "description": "The json object with response fields of the call to getDevice",
1571
+ "description": "The json object with request fields of the call to getDevice",
1571
1572
  "additionalProperties": {
1572
1573
  "type": [
1573
1574
  "string",
@@ -1650,12 +1651,12 @@
1650
1651
  "properties": {
1651
1652
  "path": {
1652
1653
  "type": "string",
1653
- "description": "The fully qualified path of the call to getDevice (e.g. /rest/api/device/{deviceid})",
1654
+ "description": "The fully qualified path of the call to populate the cache (e.g. /rest/api/devices)",
1654
1655
  "default": ""
1655
1656
  },
1656
1657
  "method": {
1657
1658
  "type": "string",
1658
- "description": "The method of the call to getDevice",
1659
+ "description": "The method of the call to populate the cache",
1659
1660
  "default": "GET"
1660
1661
  },
1661
1662
  "pagination": {
@@ -1692,7 +1693,7 @@
1692
1693
  },
1693
1694
  "query": {
1694
1695
  "type": "object",
1695
- "description": "The json object with query parameters of the call to getDevice",
1696
+ "description": "The json object with query parameters of the call to populate the cache",
1696
1697
  "additionalProperties": {
1697
1698
  "type": [
1698
1699
  "string",
@@ -1702,7 +1703,7 @@
1702
1703
  },
1703
1704
  "body": {
1704
1705
  "type": "object",
1705
- "description": "The json object with body of the call to getDevice",
1706
+ "description": "The json object with body of the call to populate the cache",
1706
1707
  "additionalProperties": {
1707
1708
  "type": [
1708
1709
  "string",
@@ -1712,7 +1713,7 @@
1712
1713
  },
1713
1714
  "headers": {
1714
1715
  "type": "object",
1715
- "description": "The json object with headers of the call to getDevice",
1716
+ "description": "The json object with headers of the call to populate the cache",
1716
1717
  "additionalProperties": {
1717
1718
  "type": [
1718
1719
  "string",
@@ -1731,7 +1732,7 @@
1731
1732
  },
1732
1733
  "requestFields": {
1733
1734
  "type": "object",
1734
- "description": "The json object with response fields of the call to getDevice",
1735
+ "description": "The json object with request fields of the call to populate the cache",
1735
1736
  "additionalProperties": {
1736
1737
  "type": [
1737
1738
  "string",
@@ -1747,7 +1748,7 @@
1747
1748
  },
1748
1749
  "responseFields": {
1749
1750
  "type": "object",
1750
- "description": "The json object with response fields of the call to getDevice",
1751
+ "description": "The json object with response fields of the call to populate the cache",
1751
1752
  "additionalProperties": {
1752
1753
  "type": [
1753
1754
  "string",
@@ -0,0 +1,120 @@
1
+ {
2
+ "errors": [],
3
+ "statistics": [
4
+ {
5
+ "owner": "errorJson",
6
+ "description": "New adapter errors available for use",
7
+ "value": 0
8
+ },
9
+ {
10
+ "owner": "errorJson",
11
+ "description": "Adapter errors no longer available for use",
12
+ "value": 0
13
+ },
14
+ {
15
+ "owner": "errorJson",
16
+ "description": "Adapter errors that have been updated (e.g. recommendation changes)",
17
+ "value": 31
18
+ },
19
+ {
20
+ "owner": "packageJson",
21
+ "description": "Number of production dependencies",
22
+ "value": 15
23
+ },
24
+ {
25
+ "owner": "packageJson",
26
+ "description": "Number of development dependencies",
27
+ "value": 6
28
+ },
29
+ {
30
+ "owner": "packageJson",
31
+ "description": "Number of npm scripts",
32
+ "value": 17
33
+ },
34
+ {
35
+ "owner": "packageJson",
36
+ "description": "Runtime Library dependency",
37
+ "value": "6.1.14"
38
+ },
39
+ {
40
+ "owner": "propertiesSchemaJson",
41
+ "description": "Adapter properties defined in the propertiesSchema file",
42
+ "value": 86
43
+ },
44
+ {
45
+ "owner": "markdown",
46
+ "description": "Number of lines in the README.md",
47
+ "value": 345
48
+ },
49
+ {
50
+ "owner": "markdown",
51
+ "description": "Number of lines in the SUMMARY.md",
52
+ "value": 9
53
+ },
54
+ {
55
+ "owner": "markdown",
56
+ "description": "Number of lines in the PROPERTIES.md",
57
+ "value": 682
58
+ },
59
+ {
60
+ "owner": "markdown",
61
+ "description": "Number of lines in the TROUBLESHOOT.md",
62
+ "value": 57
63
+ },
64
+ {
65
+ "owner": "markdown",
66
+ "description": "Number of lines in the ENHANCE.md",
67
+ "value": 70
68
+ },
69
+ {
70
+ "owner": "markdown",
71
+ "description": "Number of lines in the BROKER.md",
72
+ "value": 70
73
+ },
74
+ {
75
+ "owner": "unitTestJS",
76
+ "description": "Number of lines of code in unit tests",
77
+ "value": 2381
78
+ },
79
+ {
80
+ "owner": "unitTestJS",
81
+ "description": "Number of unit tests",
82
+ "value": 132
83
+ },
84
+ {
85
+ "owner": "integrationTestJS",
86
+ "description": "Number of lines of code in integration tests",
87
+ "value": 1424
88
+ },
89
+ {
90
+ "owner": "integrationTestJS",
91
+ "description": "Number of integration tests",
92
+ "value": 46
93
+ },
94
+ {
95
+ "owner": "staticFile",
96
+ "description": "Number of lines of code in adapterBase.js",
97
+ "value": 1527
98
+ },
99
+ {
100
+ "owner": "staticFile",
101
+ "description": "Number of static files added",
102
+ "value": 37
103
+ },
104
+ {
105
+ "owner": "Overall",
106
+ "description": "Total lines of Code",
107
+ "value": 5332
108
+ },
109
+ {
110
+ "owner": "Overall",
111
+ "description": "Total Tests",
112
+ "value": 178
113
+ },
114
+ {
115
+ "owner": "Overall",
116
+ "description": "Total Files",
117
+ "value": 6
118
+ }
119
+ ]
120
+ }
@@ -276,4 +276,4 @@
276
276
  "brokers": [],
277
277
  "logLevel": "none",
278
278
  "timeout": 120000
279
- }
279
+ }
@@ -280,10 +280,10 @@ describe('[unit] Openstack_glance Adapter Test', () => {
280
280
  assert.notEqual(null, packageDotJson.dependencies);
281
281
  assert.notEqual('', packageDotJson.dependencies);
282
282
  assert.equal('8.17.1', packageDotJson.dependencies.ajv);
283
- assert.equal('1.12.2', packageDotJson.dependencies.axios);
283
+ assert.equal('1.13.5', packageDotJson.dependencies.axios);
284
284
  assert.equal('11.1.0', packageDotJson.dependencies.commander);
285
285
  assert.equal('11.3.0', packageDotJson.dependencies['fs-extra']);
286
- assert.equal('10.8.2', packageDotJson.dependencies.mocha);
286
+ assert.equal('11.3.0', packageDotJson.dependencies.mocha);
287
287
  assert.equal('2.0.1', packageDotJson.dependencies['mocha-param']);
288
288
  assert.equal('0.4.4', packageDotJson.dependencies.ping);
289
289
  assert.equal('1.4.10', packageDotJson.dependencies['readline-sync']);
@@ -19,17 +19,14 @@ function createObjectForFunction(
19
19
  workflow
20
20
  ) {
21
21
  const funcObject = {};
22
- // if the entity path is not set, then the object is not created.
23
- if (entityPath !== undefined) {
24
- funcObject.method_signature = `${funcName}(${funcArgs.join(', ')})`;
25
- funcObject.path = entityPath;
26
- if (description === undefined) {
27
- funcObject.description = '';
28
- funcObject.workflow = 'No';
29
- } else {
30
- funcObject.description = description;
31
- funcObject.workflow = workflow;
32
- }
22
+ funcObject.method_signature = `${funcName}(${funcArgs.join(', ')})`;
23
+ funcObject.path = entityPath !== undefined ? entityPath : '';
24
+ if (description === undefined) {
25
+ funcObject.description = '';
26
+ funcObject.workflow = 'No';
27
+ } else {
28
+ funcObject.description = description;
29
+ funcObject.workflow = workflow;
33
30
  }
34
31
  return funcObject;
35
32
  }
@@ -77,7 +74,8 @@ function readFileUsingLib(filename, descriptionObj, workflowObj, functionList) {
77
74
  // parsing the file to get the function and class declarations.
78
75
  const aFileFuncArgs = acorn.parse(aFile, { ecmaVersion: 2020 });
79
76
 
80
- let callName = 'identifyRequest';
77
+ // Track all method names that can be called (identifyRequest + any proxy methods)
78
+ const allowedCallNames = new Set(['identifyRequest']);
81
79
  // Looping through all the declarations parsed:
82
80
  aFileFuncArgs.body.forEach((e) => {
83
81
  // Getting only the class declaration as it has our required functions.
@@ -103,9 +101,10 @@ function readFileUsingLib(filename, descriptionObj, workflowObj, functionList) {
103
101
  method.value.body.body.forEach((statement) => {
104
102
  recurseCallExpressions(statement, callList);
105
103
  });
104
+ // Find calls to identifyRequest OR any discovered proxy methods
106
105
  const requests = [];
107
106
  for (let i = 0; i < callList.length; i += 1) {
108
- if (callList[i].callee.property && callList[i].callee.property.name === callName) {
107
+ if (callList[i].callee.property && allowedCallNames.has(callList[i].callee.property.name)) {
109
108
  requests.push(callList[i]);
110
109
  }
111
110
  }
@@ -114,34 +113,60 @@ function readFileUsingLib(filename, descriptionObj, workflowObj, functionList) {
114
113
  if (expr.arguments.length < 2) {
115
114
  throw new Error(`Bad inputs in method ${funcName}`);
116
115
  }
117
- const entity = expr.arguments[0].value;
118
- const actionName = expr.arguments[1].value;
119
- if (expr !== undefined && (expr.arguments[0].type !== 'Literal' || expr.arguments[1].type !== 'Literal')) {
120
- const param1 = method.value.params[0];
121
- const param2 = method.value.params[1];
122
- if (param1.type !== 'Identifier' || param2.type !== 'Identifier'
123
- || expr.arguments[0].type !== 'Identifier' || expr.arguments[1].type !== 'Identifier'
124
- || param1.name !== expr.arguments[0].name || param2.name !== expr.arguments[1].name) {
125
- throw new Error(`identifyRequest proxy method ${funcName} unknown format`);
126
- } else if (callName !== 'identifyRequest') {
127
- throw new Error(`MethodDocumentor not yet programmed to handle multiple helper methods: 1) ${callName}, 2) ${funcName}`);
116
+
117
+ const arg0Type = expr.arguments[0].type;
118
+ const arg1Type = expr.arguments[1].type;
119
+
120
+ let entityPath;
121
+
122
+ if (arg0Type === 'Literal' && arg1Type === 'Literal') {
123
+ const entity = expr.arguments[0].value;
124
+ const actionName = expr.arguments[1].value;
125
+ entityPath = getPathFromEntity(entity, actionName);
126
+ } else {
127
+ // Non-standard format: anything that's not both literals
128
+ // Special handling for proxy methods (both args are identifiers matching first 2 params)
129
+ if (arg0Type === 'Identifier' && arg1Type === 'Identifier') {
130
+ const param1 = method.value.params[0];
131
+ const param2 = method.value.params[1];
132
+ const arg0Name = expr.arguments[0].name;
133
+ const arg1Name = expr.arguments[1].name;
134
+
135
+ // Check if this is a valid proxy method
136
+ const isValidProxy = param1 && param2
137
+ && param1.type === 'Identifier' && param2.type === 'Identifier'
138
+ && param1.name === arg0Name && param2.name === arg1Name;
139
+
140
+ // Only process valid proxy methods
141
+ if (isValidProxy) {
142
+ const calledMethod = expr.callee.property.name;
143
+
144
+ // Skip nested proxies (proxies calling other proxies)
145
+ if (calledMethod !== 'identifyRequest') {
146
+ console.log(`Skipping nested proxy method: ${funcName} (calls ${calledMethod})`);
147
+ return;
148
+ }
149
+
150
+ // First-level proxy: calls identifyRequest directly
151
+ // Add this proxy to the set so other methods can call it
152
+ allowedCallNames.add(funcName);
153
+ }
128
154
  }
129
- callName = funcName;
155
+
156
+ // All non-standard formats get documented without path
157
+ entityPath = undefined;
130
158
  }
131
- const entityPath = getPathFromEntity(entity, actionName);
132
159
 
133
160
  // Creating and storing the object for the method.
134
- if (entityPath !== undefined) {
135
- functionList.push(
136
- createObjectForFunction(
137
- funcName,
138
- funcArgs,
139
- entityPath,
140
- descriptionObj[funcName],
141
- workflowObj[funcName]
142
- )
143
- );
144
- }
161
+ functionList.push(
162
+ createObjectForFunction(
163
+ funcName,
164
+ funcArgs,
165
+ entityPath,
166
+ descriptionObj[funcName],
167
+ workflowObj[funcName]
168
+ )
169
+ );
145
170
  }
146
171
  });
147
172
  }