@bifos/nhncloud-cli 0.5.0 → 0.6.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/dist/index.js CHANGED
@@ -24,8 +24,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
24
24
  ));
25
25
 
26
26
  // src/index.ts
27
- var import_commander38 = require("commander");
28
- var import_chalk12 = __toESM(require("chalk"));
27
+ var import_commander42 = require("commander");
28
+ var import_chalk14 = __toESM(require("chalk"));
29
29
 
30
30
  // src/utils/spinner.ts
31
31
  var import_ora = __toESM(require("ora"));
@@ -317,7 +317,7 @@ function iaasCachePath(profile, region) {
317
317
  function isIaasTokenCache(val) {
318
318
  if (typeof val !== "object" || val === null) return false;
319
319
  const obj = val;
320
- return typeof obj["tokenId"] === "string" && typeof obj["expiresAt"] === "string" && typeof obj["computeEndpoint"] === "string" && typeof obj["imageEndpoint"] === "string" && typeof obj["networkEndpoint"] === "string" && typeof obj["blockStorageEndpoint"] === "string";
320
+ return typeof obj["tokenId"] === "string" && typeof obj["expiresAt"] === "string" && typeof obj["computeEndpoint"] === "string" && typeof obj["imageEndpoint"] === "string" && typeof obj["networkEndpoint"] === "string" && typeof obj["blockStorageEndpoint"] === "string" && typeof obj["nksEndpoint"] === "string";
321
321
  }
322
322
  async function readIaasToken(profile, region) {
323
323
  const filePath = iaasCachePath(profile, region);
@@ -334,7 +334,8 @@ async function readIaasToken(profile, region) {
334
334
  computeEndpoint: parsed.computeEndpoint,
335
335
  imageEndpoint: parsed.imageEndpoint,
336
336
  networkEndpoint: parsed.networkEndpoint,
337
- blockStorageEndpoint: parsed.blockStorageEndpoint
337
+ blockStorageEndpoint: parsed.blockStorageEndpoint,
338
+ nksEndpoint: parsed.nksEndpoint
338
339
  };
339
340
  } catch {
340
341
  return null;
@@ -349,7 +350,8 @@ async function writeIaasToken(profile, region, data) {
349
350
  computeEndpoint: data.computeEndpoint,
350
351
  imageEndpoint: data.imageEndpoint,
351
352
  networkEndpoint: data.networkEndpoint,
352
- blockStorageEndpoint: data.blockStorageEndpoint
353
+ blockStorageEndpoint: data.blockStorageEndpoint,
354
+ nksEndpoint: data.nksEndpoint
353
355
  };
354
356
  const tmp = filePath + "." + (0, import_node_crypto.randomBytes)(4).toString("hex") + ".tmp";
355
357
  await (0, import_promises2.writeFile)(tmp, JSON.stringify(cache, null, 2), { encoding: "utf-8", mode: 384 });
@@ -495,6 +497,11 @@ var BLOCKSTORAGE_HOST = {
495
497
  jp1: "jp1-api-block-storage-infrastructure.nhncloudservice.com"
496
498
  };
497
499
  var IAAS_REGIONS = Object.keys(INSTANCE_HOST).join(", ");
500
+ var NKS_HOST = {
501
+ kr1: "kr1-api-kubernetes-infrastructure.nhncloudservice.com",
502
+ kr2: "kr2-api-kubernetes-infrastructure.nhncloudservice.com",
503
+ kr3: "kr3-api-kubernetes-infrastructure.nhncloudservice.com"
504
+ };
498
505
  var NCR_HOST = {
499
506
  kr1: "kr1-ncr.api.nhncloudservice.com",
500
507
  kr2: "kr2-ncr.api.nhncloudservice.com",
@@ -550,6 +557,16 @@ function blockStorageHost(region) {
550
557
  }
551
558
  return host;
552
559
  }
560
+ function nksHost(region) {
561
+ const host = NKS_HOST[region];
562
+ if (!host) {
563
+ throw new NhnCloudCliError(
564
+ `\uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 NKS region \uC785\uB2C8\uB2E4: "${region}". \uC0AC\uC6A9 \uAC00\uB2A5\uD55C region: ${Object.keys(NKS_HOST).join(", ")}`,
565
+ EXIT_PARAM_ERROR
566
+ );
567
+ }
568
+ return host;
569
+ }
553
570
 
554
571
  // src/api/keystone.ts
555
572
  function isKeystoneTokenResponse(val) {
@@ -570,7 +587,8 @@ async function getIaasToken(profile, iaas, forceRefresh = false) {
570
587
  computeEndpoint: cached.computeEndpoint,
571
588
  imageEndpoint: cached.imageEndpoint,
572
589
  networkEndpoint: cached.networkEndpoint,
573
- blockStorageEndpoint: cached.blockStorageEndpoint
590
+ blockStorageEndpoint: cached.blockStorageEndpoint,
591
+ nksEndpoint: cached.nksEndpoint
574
592
  };
575
593
  }
576
594
  }
@@ -579,6 +597,7 @@ async function getIaasToken(profile, iaas, forceRefresh = false) {
579
597
  const imageEndpoint = `https://${imageHost(iaas.region)}/v2`;
580
598
  const networkEndpoint = `https://${networkHost(iaas.region)}/v2.0`;
581
599
  const blockStorageEndpoint = `https://${blockStorageHost(iaas.region)}/v2/${encodeURIComponent(iaas.tenantId)}`;
600
+ const nksEndpoint = `https://${nksHost(iaas.region)}/v1`;
582
601
  let raw;
583
602
  try {
584
603
  raw = await import_ky3.default.post(keystoneIdentityUrl(), {
@@ -605,9 +624,9 @@ async function getIaasToken(profile, iaas, forceRefresh = false) {
605
624
  const tokenId = raw.access.token.id;
606
625
  const expiresAt = raw.access.token.expires;
607
626
  if (!forceRefresh) {
608
- await writeIaasToken(profile, iaas.region, { tokenId, expiresAt, computeEndpoint, imageEndpoint, networkEndpoint, blockStorageEndpoint });
627
+ await writeIaasToken(profile, iaas.region, { tokenId, expiresAt, computeEndpoint, imageEndpoint, networkEndpoint, blockStorageEndpoint, nksEndpoint });
609
628
  }
610
- return { tokenId, computeEndpoint, imageEndpoint, networkEndpoint, blockStorageEndpoint };
629
+ return { tokenId, computeEndpoint, imageEndpoint, networkEndpoint, blockStorageEndpoint, nksEndpoint };
611
630
  }
612
631
 
613
632
  // src/services/logncrash/client.ts
@@ -1535,7 +1554,8 @@ function isBinaryGroup(val) {
1535
1554
  if (typeof val !== "object" || val === null) return false;
1536
1555
  const obj = val;
1537
1556
  const keyType = typeof obj["key"];
1538
- return (keyType === "number" || keyType === "string") && typeof obj["name"] === "string";
1557
+ const descriptionType = typeof obj["description"];
1558
+ return (keyType === "number" || keyType === "string") && typeof obj["name"] === "string" && (descriptionType === "undefined" || descriptionType === "string" || obj["description"] === null);
1539
1559
  }
1540
1560
  function isBinary(val) {
1541
1561
  if (typeof val !== "object" || val === null) return false;
@@ -4205,25 +4225,1376 @@ var tagsCommand = new import_commander37.Command("tags").description("\uD2B9\uC8
4205
4225
  });
4206
4226
  });
4207
4227
 
4228
+ // src/commands/nks/supports.ts
4229
+ var import_commander38 = require("commander");
4230
+
4231
+ // src/commands/nks/helpers.ts
4232
+ var import_promises4 = require("fs/promises");
4233
+
4234
+ // src/services/nks/client.ts
4235
+ var import_ky11 = __toESM(require("ky"));
4236
+
4237
+ // src/services/nks/types.ts
4238
+ function isNksClusterSummary(val) {
4239
+ if (typeof val !== "object" || val === null) return false;
4240
+ const obj = val;
4241
+ return typeof obj["uuid"] === "string" && typeof obj["name"] === "string" && typeof obj["status"] === "string" && typeof obj["health_status"] === "string" && (typeof obj["node_count"] === "number" || typeof obj["node_count"] === "string") && typeof obj["kube_tag"] === "string";
4242
+ }
4243
+ function isNksSupports(val) {
4244
+ if (typeof val !== "object" || val === null) return false;
4245
+ const obj = val;
4246
+ return isPlainObject(obj["supported_k8s"]) && isPlainObject(obj["supported_event_type"]);
4247
+ }
4248
+ function isPlainObject(val) {
4249
+ return typeof val === "object" && val !== null && !Array.isArray(val);
4250
+ }
4251
+ function isNksNamedResource(val) {
4252
+ if (!isPlainObject(val)) return false;
4253
+ if ("header" in val || "body" in val) return false;
4254
+ const uuid = val["uuid"];
4255
+ const id = val["id"];
4256
+ const name = val["name"];
4257
+ const status = val["status"];
4258
+ const hasKnownResourceField = typeof uuid === "string" || typeof id === "string" || typeof name === "string" || typeof status === "string";
4259
+ return hasKnownResourceField && (uuid === void 0 || typeof uuid === "string") && (id === void 0 || typeof id === "string") && (name === void 0 || typeof name === "string") && (status === void 0 || typeof status === "string");
4260
+ }
4261
+ function isNksNodeGroupSummary(val) {
4262
+ if (!isPlainObject(val)) return false;
4263
+ return typeof val["uuid"] === "string" && typeof val["name"] === "string" && typeof val["status"] === "string";
4264
+ }
4265
+ function isNksAddonType(val) {
4266
+ return isPlainObject(val) && typeof val["name"] === "string";
4267
+ }
4268
+ function isNksAddon(val) {
4269
+ return isPlainObject(val) && typeof val["name"] === "string";
4270
+ }
4271
+ function isNksClusterIpAcl(val) {
4272
+ if (!isPlainObject(val) || "header" in val || "body" in val) return false;
4273
+ if (typeof val["cluster_uuid"] !== "string" || !isBooleanLike(val["enable"])) return false;
4274
+ const isEnabled = val["enable"] === true || val["enable"] === "true";
4275
+ if (!isEnabled) return true;
4276
+ return typeof val["action"] === "string" && Array.isArray(val["ipacl_targets"]);
4277
+ }
4278
+ function isNksNodeGroupAutoscale(val) {
4279
+ return isPlainObject(val) && !("header" in val) && !("body" in val) && isBooleanLike(val["ca_enable"]) && typeof val["clusterautoscale"] === "string";
4280
+ }
4281
+ function isBooleanLike(val) {
4282
+ return typeof val === "boolean" || val === "true" || val === "false";
4283
+ }
4284
+ function isNksUuidResponse(val) {
4285
+ return isPlainObject(val) && typeof val["uuid"] === "string";
4286
+ }
4287
+
4288
+ // src/services/nks/client.ts
4289
+ var DEFAULT_TIMEOUT_MS7 = 3e4;
4290
+ function isClustersResponse(val) {
4291
+ if (typeof val !== "object" || val === null) return false;
4292
+ const obj = val;
4293
+ return Array.isArray(obj["clusters"]) && obj["clusters"].every(isNksClusterSummary);
4294
+ }
4295
+ function isNamedResourceArrayResponse(key, val) {
4296
+ if (typeof val !== "object" || val === null) return false;
4297
+ const obj = val;
4298
+ return Array.isArray(obj[key]) && obj[key].every(isNksNamedResource);
4299
+ }
4300
+ function isConfigResponse(val) {
4301
+ if (typeof val !== "object" || val === null) return false;
4302
+ const obj = val;
4303
+ return typeof obj["config"] === "string";
4304
+ }
4305
+ function isNodeGroupsResponse(val) {
4306
+ if (typeof val !== "object" || val === null) return false;
4307
+ const obj = val;
4308
+ return Array.isArray(obj["nodegroups"]) && obj["nodegroups"].every(isNksNodeGroupSummary);
4309
+ }
4310
+ function isAddonTypesResponse(val) {
4311
+ if (typeof val !== "object" || val === null) return false;
4312
+ const obj = val;
4313
+ return Array.isArray(obj["addon_types"]) && obj["addon_types"].every(isNksAddonType);
4314
+ }
4315
+ function isAddonsResponse(val) {
4316
+ if (typeof val !== "object" || val === null) return false;
4317
+ const obj = val;
4318
+ return Array.isArray(obj["addons"]) && obj["addons"].every(isNksAddon);
4319
+ }
4320
+ var NksClient = class {
4321
+ tokenId;
4322
+ nksEndpoint;
4323
+ constructor(tokenId, nksEndpoint) {
4324
+ this.tokenId = tokenId;
4325
+ this.nksEndpoint = nksEndpoint;
4326
+ }
4327
+ authHeaders() {
4328
+ return {
4329
+ "X-Auth-Token": this.tokenId,
4330
+ "OpenStack-API-Version": "container-infra latest"
4331
+ };
4332
+ }
4333
+ /** NKS 지원 Kubernetes 버전과 event type 을 조회한다 (GET /supports). */
4334
+ async supports() {
4335
+ const url = `${this.nksEndpoint}/supports`;
4336
+ try {
4337
+ const raw = await import_ky11.default.get(url, {
4338
+ headers: this.authHeaders(),
4339
+ retry: 0,
4340
+ timeout: DEFAULT_TIMEOUT_MS7
4341
+ }).json();
4342
+ if (!isNksSupports(raw)) {
4343
+ throw new NhnCloudCliError(
4344
+ "nks supports \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 supported_k8s / supported_event_type \uAC1D\uCCB4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
4345
+ EXIT_API_ERROR
4346
+ );
4347
+ }
4348
+ return raw;
4349
+ } catch (err) {
4350
+ throw toNhnCloudCliError(err);
4351
+ }
4352
+ }
4353
+ /** NKS 클러스터 목록을 조회한다 (GET /clusters). */
4354
+ async listClusters() {
4355
+ const url = `${this.nksEndpoint}/clusters`;
4356
+ try {
4357
+ const raw = await import_ky11.default.get(url, {
4358
+ headers: this.authHeaders(),
4359
+ retry: 0,
4360
+ timeout: DEFAULT_TIMEOUT_MS7
4361
+ }).json();
4362
+ if (!isClustersResponse(raw)) {
4363
+ throw new NhnCloudCliError(
4364
+ "nks cluster list \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 clusters \uBC30\uC5F4\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
4365
+ EXIT_API_ERROR
4366
+ );
4367
+ }
4368
+ return raw.clusters;
4369
+ } catch (err) {
4370
+ throw toNhnCloudCliError(err);
4371
+ }
4372
+ }
4373
+ async getCluster(cluster) {
4374
+ return this.getFlatNamedResource(
4375
+ `/clusters/${encodeURIComponent(cluster)}`,
4376
+ "nks cluster get \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 cluster \uAC1D\uCCB4\uAC00 \uC544\uB2D9\uB2C8\uB2E4."
4377
+ );
4378
+ }
4379
+ async createCluster(payload) {
4380
+ return this.requestUuid("post", "/clusters", payload, "nks cluster create \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 uuid \uD544\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.");
4381
+ }
4382
+ async deleteCluster(cluster) {
4383
+ await this.requestNoBody("delete", `/clusters/${encodeURIComponent(cluster)}`);
4384
+ }
4385
+ async resizeCluster(params) {
4386
+ const payload = {
4387
+ nodegroup: params.nodegroup,
4388
+ node_count: params.nodeCount
4389
+ };
4390
+ if (params.nodesToRemove && params.nodesToRemove.length > 0) {
4391
+ payload["nodes_to_remove"] = params.nodesToRemove;
4392
+ }
4393
+ return this.requestUuid(
4394
+ "post",
4395
+ `/clusters/${encodeURIComponent(params.cluster)}/actions/resize`,
4396
+ payload,
4397
+ "nks cluster resize \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 uuid \uD544\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."
4398
+ );
4399
+ }
4400
+ async setClusterIpAcl(cluster, payload) {
4401
+ return this.requestUuid(
4402
+ "post",
4403
+ `/clusters/${encodeURIComponent(cluster)}/api_ep_ipacl`,
4404
+ payload,
4405
+ "nks cluster set-ipacl \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 uuid \uD544\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."
4406
+ );
4407
+ }
4408
+ async renewClusterCertificate(cluster, termOfValidity) {
4409
+ return this.requestUuid(
4410
+ "patch",
4411
+ `/certificates/${encodeURIComponent(cluster)}`,
4412
+ { term_of_validity: termOfValidity },
4413
+ "nks cluster renew-certificate \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 uuid \uD544\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."
4414
+ );
4415
+ }
4416
+ async updateClusterServiceGateway(cluster, ncrSgw, obsSgw) {
4417
+ return this.requestUuid(
4418
+ "post",
4419
+ `/clusters/${encodeURIComponent(cluster)}/actions/update_sgw`,
4420
+ { ncr_sgw: ncrSgw, obs_sgw: obsSgw },
4421
+ "nks cluster update-sgw \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 uuid \uD544\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."
4422
+ );
4423
+ }
4424
+ async setControlPlaneLog(cluster, controlPlaneLog) {
4425
+ return this.requestUuid(
4426
+ "patch",
4427
+ `/clusters/${encodeURIComponent(cluster)}`,
4428
+ { type: "control_plane_log", control_plane_log: controlPlaneLog },
4429
+ "nks cluster set-control-plane-log \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 uuid \uD544\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."
4430
+ );
4431
+ }
4432
+ async listClusterEvents(cluster) {
4433
+ return this.getNamedResourceArray(
4434
+ "events",
4435
+ `/clusters/${encodeURIComponent(cluster)}/events`,
4436
+ "nks cluster events \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 events \uBC30\uC5F4\uC774 \uC5C6\uC2B5\uB2C8\uB2E4."
4437
+ );
4438
+ }
4439
+ async getClusterEvent(cluster, event) {
4440
+ return this.getFlatNamedResource(
4441
+ `/clusters/${encodeURIComponent(cluster)}/events/${encodeURIComponent(event)}`,
4442
+ "nks cluster event \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 event \uAC1D\uCCB4\uAC00 \uC544\uB2D9\uB2C8\uB2E4."
4443
+ );
4444
+ }
4445
+ async getClusterKubeconfig(cluster) {
4446
+ const raw = await this.getJson(`/clusters/${encodeURIComponent(cluster)}/config`);
4447
+ if (!isConfigResponse(raw)) {
4448
+ throw new NhnCloudCliError(
4449
+ "nks cluster kubeconfig \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 config \uBB38\uC790\uC5F4\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
4450
+ EXIT_API_ERROR
4451
+ );
4452
+ }
4453
+ return raw.config;
4454
+ }
4455
+ async getClusterIpAcl(cluster) {
4456
+ const raw = await this.getJson(`/clusters/${encodeURIComponent(cluster)}/api_ep_ipacl`);
4457
+ if (!isNksClusterIpAcl(raw)) {
4458
+ throw new NhnCloudCliError(
4459
+ "nks cluster ipacl \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 cluster_uuid, enable, action, ipacl_targets \uD544\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
4460
+ EXIT_API_ERROR
4461
+ );
4462
+ }
4463
+ return raw;
4464
+ }
4465
+ async listNodeGroups(cluster) {
4466
+ const raw = await this.getJson(`/clusters/${encodeURIComponent(cluster)}/nodegroups`);
4467
+ if (!isNodeGroupsResponse(raw)) {
4468
+ throw new NhnCloudCliError(
4469
+ "nks nodegroup list \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 nodegroups \uBC30\uC5F4\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
4470
+ EXIT_API_ERROR
4471
+ );
4472
+ }
4473
+ return raw.nodegroups;
4474
+ }
4475
+ async getNodeGroup(cluster, nodegroup) {
4476
+ const raw = await this.getJson(`/clusters/${encodeURIComponent(cluster)}/nodegroups/${encodeURIComponent(nodegroup)}`);
4477
+ if (!isNksNodeGroupSummary(raw)) {
4478
+ throw new NhnCloudCliError(
4479
+ "nks nodegroup get \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 nodegroup \uAC1D\uCCB4\uAC00 \uC544\uB2D9\uB2C8\uB2E4.",
4480
+ EXIT_API_ERROR
4481
+ );
4482
+ }
4483
+ return raw;
4484
+ }
4485
+ async getNodeGroupAutoscale(cluster, nodegroup) {
4486
+ const raw = await this.getJson(`/clusters/${encodeURIComponent(cluster)}/nodegroups/${encodeURIComponent(nodegroup)}/autoscale`);
4487
+ if (!isNksNodeGroupAutoscale(raw)) {
4488
+ throw new NhnCloudCliError(
4489
+ "nks nodegroup autoscale \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 ca_enable, clusterautoscale \uD544\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
4490
+ EXIT_API_ERROR
4491
+ );
4492
+ }
4493
+ return raw;
4494
+ }
4495
+ async createNodeGroup(cluster, payload) {
4496
+ return this.requestUuid(
4497
+ "post",
4498
+ `/clusters/${encodeURIComponent(cluster)}/nodegroups`,
4499
+ payload,
4500
+ "nks nodegroup create \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 uuid \uD544\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."
4501
+ );
4502
+ }
4503
+ async deleteNodeGroup(cluster, nodegroup) {
4504
+ await this.requestNoBody("delete", `/clusters/${encodeURIComponent(cluster)}/nodegroups/${encodeURIComponent(nodegroup)}`);
4505
+ }
4506
+ async stopNodeGroupNodes(cluster, nodegroup, nodes) {
4507
+ return this.requestUuid(
4508
+ "post",
4509
+ `/clusters/${encodeURIComponent(cluster)}/nodegroups/${encodeURIComponent(nodegroup)}/stop_node`,
4510
+ { node_list: nodes.join(":") },
4511
+ "nks nodegroup stop-node \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 uuid \uD544\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."
4512
+ );
4513
+ }
4514
+ async startNodeGroupNodes(cluster, nodegroup, nodes) {
4515
+ return this.requestUuid(
4516
+ "post",
4517
+ `/clusters/${encodeURIComponent(cluster)}/nodegroups/${encodeURIComponent(nodegroup)}/start_node`,
4518
+ { node_list: nodes.join(":") },
4519
+ "nks nodegroup start-node \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 uuid \uD544\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."
4520
+ );
4521
+ }
4522
+ async setNodeGroupAutoscale(cluster, nodegroup, payload) {
4523
+ return this.requestUuid(
4524
+ "post",
4525
+ `/clusters/${encodeURIComponent(cluster)}/nodegroups/${encodeURIComponent(nodegroup)}/autoscale`,
4526
+ payload,
4527
+ "nks nodegroup set-autoscale \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 uuid \uD544\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."
4528
+ );
4529
+ }
4530
+ async setNodeGroupMetricAutoscale(cluster, nodegroup, payload) {
4531
+ return this.patchNodeGroup(cluster, nodegroup, "metric_base_autoscale", payload);
4532
+ }
4533
+ async upgradeNodeGroup(cluster, nodegroup, params) {
4534
+ const payload = { version: params.version };
4535
+ if (params.numBufferNodes !== void 0) payload["num_buffer_nodes"] = params.numBufferNodes;
4536
+ if (params.numMaxUnavailableNodes !== void 0) payload["num_max_unavailable_nodes"] = params.numMaxUnavailableNodes;
4537
+ return this.requestUuid(
4538
+ "post",
4539
+ `/clusters/${encodeURIComponent(cluster)}/nodegroups/${encodeURIComponent(nodegroup)}/upgrade`,
4540
+ payload,
4541
+ "nks nodegroup upgrade \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 uuid \uD544\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."
4542
+ );
4543
+ }
4544
+ async setNodeGroupUserscript(cluster, nodegroup, contents) {
4545
+ return this.requestUuid(
4546
+ "post",
4547
+ `/clusters/${encodeURIComponent(cluster)}/nodegroups/${encodeURIComponent(nodegroup)}/userscript`,
4548
+ { contents },
4549
+ "nks nodegroup set-userscript \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 uuid \uD544\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."
4550
+ );
4551
+ }
4552
+ async updateNodeGroupFlavor(cluster, nodegroup, params) {
4553
+ const payload = { flavor_id: params.flavorId };
4554
+ if (params.numBufferNodes !== void 0) payload["num_buffer_nodes"] = params.numBufferNodes;
4555
+ if (params.numMaxUnavailableNodes !== void 0) payload["num_max_unavailable_nodes"] = params.numMaxUnavailableNodes;
4556
+ return this.patchNodeGroup(cluster, nodegroup, "flavor_id", payload);
4557
+ }
4558
+ async setNodeGroupFipAutoBind(cluster, nodegroup, payload) {
4559
+ return this.patchNodeGroup(cluster, nodegroup, "fip_auto_bind", payload);
4560
+ }
4561
+ async setNodeGroupLabels(cluster, nodegroup, payload) {
4562
+ return this.patchNodeGroup(cluster, nodegroup, "k8s_node_labels", payload);
4563
+ }
4564
+ async listAddonTypes() {
4565
+ const raw = await this.getJson("/addon_types");
4566
+ if (!isAddonTypesResponse(raw)) {
4567
+ throw new NhnCloudCliError(
4568
+ "nks addon-type list \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 addon_types \uBC30\uC5F4\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
4569
+ EXIT_API_ERROR
4570
+ );
4571
+ }
4572
+ return raw.addon_types;
4573
+ }
4574
+ async getAddonType(addonType) {
4575
+ const raw = await this.getJson(`/addon_types/${encodeURIComponent(addonType)}`);
4576
+ if (!isNksAddonType(raw)) {
4577
+ throw new NhnCloudCliError(
4578
+ "nks addon-type get \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 addon_type \uAC1D\uCCB4\uAC00 \uC544\uB2D9\uB2C8\uB2E4.",
4579
+ EXIT_API_ERROR
4580
+ );
4581
+ }
4582
+ return raw;
4583
+ }
4584
+ async listAddons(filters) {
4585
+ const searchParams = {};
4586
+ if (filters.k8sVersion) searchParams["k8s_version"] = filters.k8sVersion;
4587
+ if (filters.image) searchParams["image"] = filters.image;
4588
+ if (filters.platformVersion) searchParams["platform_version"] = filters.platformVersion;
4589
+ const raw = await this.getJson("/addons", searchParams);
4590
+ if (!isAddonsResponse(raw)) {
4591
+ throw new NhnCloudCliError(
4592
+ "nks addon list \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 addons \uBC30\uC5F4\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
4593
+ EXIT_API_ERROR
4594
+ );
4595
+ }
4596
+ return raw.addons;
4597
+ }
4598
+ async getAddon(addon) {
4599
+ const raw = await this.getJson(`/addons/${encodeURIComponent(addon)}`);
4600
+ if (!isNksAddon(raw)) {
4601
+ throw new NhnCloudCliError(
4602
+ "nks addon get \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 addon \uAC1D\uCCB4\uAC00 \uC544\uB2D9\uB2C8\uB2E4.",
4603
+ EXIT_API_ERROR
4604
+ );
4605
+ }
4606
+ return raw;
4607
+ }
4608
+ async listClusterAddons(cluster) {
4609
+ const raw = await this.getJson(`/clusters/${encodeURIComponent(cluster)}/addons`);
4610
+ if (!isAddonsResponse(raw)) {
4611
+ throw new NhnCloudCliError(
4612
+ "nks cluster addon list \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 addons \uBC30\uC5F4\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
4613
+ EXIT_API_ERROR
4614
+ );
4615
+ }
4616
+ return raw.addons;
4617
+ }
4618
+ async getClusterAddon(cluster, addon) {
4619
+ const raw = await this.getJson(`/clusters/${encodeURIComponent(cluster)}/addons/${encodeURIComponent(addon)}`);
4620
+ if (!isNksAddon(raw)) {
4621
+ throw new NhnCloudCliError(
4622
+ "nks cluster addon get \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 addon \uAC1D\uCCB4\uAC00 \uC544\uB2D9\uB2C8\uB2E4.",
4623
+ EXIT_API_ERROR
4624
+ );
4625
+ }
4626
+ return raw;
4627
+ }
4628
+ async installClusterAddon(cluster, params) {
4629
+ return this.requestUuid(
4630
+ "post",
4631
+ `/clusters/${encodeURIComponent(cluster)}/addons/`,
4632
+ {
4633
+ name: params.name,
4634
+ version: params.version,
4635
+ resolve_conflicts: params.resolveConflicts
4636
+ },
4637
+ "nks cluster addon install \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 uuid \uD544\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."
4638
+ );
4639
+ }
4640
+ async updateClusterAddon(cluster, addon, params) {
4641
+ return this.requestUuid(
4642
+ "patch",
4643
+ `/clusters/${encodeURIComponent(cluster)}/addons/${encodeURIComponent(addon)}`,
4644
+ {
4645
+ version: params.version,
4646
+ resolve_conflicts: params.resolveConflicts
4647
+ },
4648
+ "nks cluster addon update \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 uuid \uD544\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."
4649
+ );
4650
+ }
4651
+ async removeClusterAddon(cluster, addon) {
4652
+ const url = `${this.nksEndpoint}/clusters/${encodeURIComponent(cluster)}/addons/${encodeURIComponent(addon)}`;
4653
+ try {
4654
+ const raw = await import_ky11.default.delete(url, { headers: this.authHeaders(), retry: 0, timeout: DEFAULT_TIMEOUT_MS7 }).json();
4655
+ if (!isNksUuidResponse(raw)) {
4656
+ throw new NhnCloudCliError(
4657
+ "nks cluster addon remove \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 uuid \uD544\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
4658
+ EXIT_API_ERROR
4659
+ );
4660
+ }
4661
+ return raw;
4662
+ } catch (err) {
4663
+ throw toNhnCloudCliError(err);
4664
+ }
4665
+ }
4666
+ async getNamedResourceArray(key, path, errorMessage) {
4667
+ const raw = await this.getJson(path);
4668
+ if (!isNamedResourceArrayResponse(key, raw)) {
4669
+ throw new NhnCloudCliError(errorMessage, EXIT_API_ERROR);
4670
+ }
4671
+ return raw[key];
4672
+ }
4673
+ async getFlatNamedResource(path, errorMessage) {
4674
+ const raw = await this.getJson(path);
4675
+ if (!isNksNamedResource(raw)) {
4676
+ throw new NhnCloudCliError(errorMessage, EXIT_API_ERROR);
4677
+ }
4678
+ return raw;
4679
+ }
4680
+ async getJson(path, searchParams) {
4681
+ const url = `${this.nksEndpoint}${path}`;
4682
+ try {
4683
+ return await import_ky11.default.get(url, {
4684
+ headers: this.authHeaders(),
4685
+ searchParams,
4686
+ retry: 0,
4687
+ timeout: DEFAULT_TIMEOUT_MS7
4688
+ }).json();
4689
+ } catch (err) {
4690
+ throw toNhnCloudCliError(err);
4691
+ }
4692
+ }
4693
+ async requestUuid(method, path, payload, errorMessage) {
4694
+ const raw = await this.requestJson(method, path, payload);
4695
+ if (!isNksUuidResponse(raw)) {
4696
+ throw new NhnCloudCliError(errorMessage, EXIT_API_ERROR);
4697
+ }
4698
+ return raw;
4699
+ }
4700
+ async requestNoBody(method, path, payload) {
4701
+ const url = `${this.nksEndpoint}${path}`;
4702
+ try {
4703
+ if (method === "delete") {
4704
+ await import_ky11.default.delete(url, { headers: this.authHeaders(), retry: 0, timeout: DEFAULT_TIMEOUT_MS7 });
4705
+ return;
4706
+ }
4707
+ await import_ky11.default.post(url, { headers: this.authHeaders(), json: payload, retry: 0, timeout: DEFAULT_TIMEOUT_MS7 });
4708
+ } catch (err) {
4709
+ throw toNhnCloudCliError(err);
4710
+ }
4711
+ }
4712
+ async requestJson(method, path, payload) {
4713
+ const url = `${this.nksEndpoint}${path}`;
4714
+ try {
4715
+ const options = { headers: this.authHeaders(), json: payload, retry: 0, timeout: DEFAULT_TIMEOUT_MS7 };
4716
+ return method === "post" ? await import_ky11.default.post(url, options).json() : await import_ky11.default.patch(url, options).json();
4717
+ } catch (err) {
4718
+ throw toNhnCloudCliError(err);
4719
+ }
4720
+ }
4721
+ async patchNodeGroup(cluster, nodegroup, type, payload) {
4722
+ return this.requestUuid(
4723
+ "patch",
4724
+ `/clusters/${encodeURIComponent(cluster)}/nodegroups/${encodeURIComponent(nodegroup)}`,
4725
+ { ...payload, type },
4726
+ "nks nodegroup patch \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 uuid \uD544\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."
4727
+ );
4728
+ }
4729
+ };
4730
+
4731
+ // src/commands/nks/helpers.ts
4732
+ async function resolveNksClient(opts) {
4733
+ const profileName = await resolveProfileName(opts.profile);
4734
+ const iaas = await getIaasCredential(profileName);
4735
+ const effectiveIaas = opts.region ? { ...iaas, region: opts.region } : iaas;
4736
+ const { tokenId, nksEndpoint } = await getIaasToken(profileName, effectiveIaas);
4737
+ return { client: new NksClient(tokenId, nksEndpoint), profileName };
4738
+ }
4739
+ async function readJsonFile(path) {
4740
+ let raw;
4741
+ try {
4742
+ raw = await (0, import_promises4.readFile)(path, "utf-8");
4743
+ } catch (err) {
4744
+ const message = err instanceof Error ? err.message : String(err);
4745
+ throw new NhnCloudCliError(`JSON \uD30C\uC77C\uC744 \uC77D\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${path} (${message})`, EXIT_PARAM_ERROR);
4746
+ }
4747
+ try {
4748
+ const parsed = JSON.parse(raw);
4749
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
4750
+ throw new Error("top-level JSON object required");
4751
+ }
4752
+ return parsed;
4753
+ } catch (err) {
4754
+ const message = err instanceof Error ? err.message : String(err);
4755
+ throw new NhnCloudCliError(`JSON \uD30C\uC77C \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4: ${path} (${message})`, EXIT_PARAM_ERROR);
4756
+ }
4757
+ }
4758
+ async function readTextFile(path) {
4759
+ try {
4760
+ return await (0, import_promises4.readFile)(path, "utf-8");
4761
+ } catch (err) {
4762
+ const message = err instanceof Error ? err.message : String(err);
4763
+ throw new NhnCloudCliError(`\uD30C\uC77C\uC744 \uC77D\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${path} (${message})`, EXIT_PARAM_ERROR);
4764
+ }
4765
+ }
4766
+ function parsePositiveInteger(value, optionName) {
4767
+ if (!/^[1-9]\d*$/.test(value)) {
4768
+ throw new NhnCloudCliError(`${optionName} \uB294 \uC591\uC758 \uC815\uC218\uC5EC\uC57C \uD569\uB2C8\uB2E4: ${JSON.stringify(value)}`, EXIT_PARAM_ERROR);
4769
+ }
4770
+ return Number(value);
4771
+ }
4772
+ function parseNonNegativeInteger(value, optionName) {
4773
+ if (!/^\d+$/.test(value)) {
4774
+ throw new NhnCloudCliError(`${optionName} \uB294 0 \uC774\uC0C1\uC758 \uC815\uC218\uC5EC\uC57C \uD569\uB2C8\uB2E4: ${JSON.stringify(value)}`, EXIT_PARAM_ERROR);
4775
+ }
4776
+ return Number(value);
4777
+ }
4778
+
4779
+ // src/commands/nks/supports.ts
4780
+ var supportsCommand = new import_commander38.Command("supports").description("NKS \uC9C0\uC6D0 Kubernetes \uBC84\uC804\uACFC event type \uC744 \uC870\uD68C\uD55C\uB2E4").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (_opts, cmd) => {
4781
+ const opts = cmd.optsWithGlobals();
4782
+ const { client } = await resolveNksClient(opts);
4783
+ startSpinner("NKS \uC9C0\uC6D0 \uC815\uBCF4 \uC870\uD68C \uC911...");
4784
+ let supports;
4785
+ try {
4786
+ supports = await client.supports();
4787
+ } catch (err) {
4788
+ stopSpinner(false);
4789
+ throw err;
4790
+ }
4791
+ stopSpinner(true);
4792
+ output(opts, {
4793
+ headers: ["kubernetes_version", "supported"],
4794
+ rows: Object.entries(supports.supported_k8s).map(([version, supported]) => [
4795
+ version,
4796
+ String(supported)
4797
+ ]),
4798
+ raw: supports,
4799
+ ids: Object.keys(supports.supported_k8s)
4800
+ });
4801
+ });
4802
+
4803
+ // src/commands/nks/cluster.ts
4804
+ var import_promises5 = require("fs/promises");
4805
+ var import_commander39 = require("commander");
4806
+ var import_chalk12 = __toESM(require("chalk"));
4807
+ var listCommand6 = new import_commander39.Command("list").description("NKS \uD074\uB7EC\uC2A4\uD130 \uBAA9\uB85D\uC744 \uC870\uD68C\uD55C\uB2E4").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (_opts, cmd) => {
4808
+ const opts = cmd.optsWithGlobals();
4809
+ const { client } = await resolveNksClient(opts);
4810
+ startSpinner("NKS \uD074\uB7EC\uC2A4\uD130 \uBAA9\uB85D \uC870\uD68C \uC911...");
4811
+ let clusters;
4812
+ try {
4813
+ clusters = await client.listClusters();
4814
+ } catch (err) {
4815
+ stopSpinner(false);
4816
+ throw err;
4817
+ }
4818
+ stopSpinner(true);
4819
+ output(opts, {
4820
+ headers: ["uuid", "name", "status", "health_status", "node_count", "kube_tag"],
4821
+ rows: clusters.map((cluster) => [
4822
+ cluster.uuid,
4823
+ cluster.name,
4824
+ cluster.status,
4825
+ cluster.health_status,
4826
+ String(cluster.node_count),
4827
+ cluster.kube_tag
4828
+ ]),
4829
+ raw: clusters,
4830
+ ids: clusters.map((cluster) => cluster.uuid)
4831
+ });
4832
+ });
4833
+ function resourceId(resource) {
4834
+ return resource.uuid ?? resource.id ?? resource.name ?? "";
4835
+ }
4836
+ function resourceRow(resource) {
4837
+ return [
4838
+ resourceId(resource),
4839
+ resource.name ?? "",
4840
+ resource.status ?? ""
4841
+ ];
4842
+ }
4843
+ function addonRow(addon) {
4844
+ return [
4845
+ addon.uuid ?? addon.id ?? addon.name,
4846
+ addon.name,
4847
+ addon.version ?? "",
4848
+ addon.status ?? ""
4849
+ ];
4850
+ }
4851
+ function clusterIpAclRow(ipAcl) {
4852
+ return [
4853
+ ipAcl.cluster_uuid,
4854
+ String(ipAcl.enable),
4855
+ ipAcl.action ?? "",
4856
+ String(ipAcl.ipacl_targets?.length ?? 0)
4857
+ ];
4858
+ }
4859
+ function uuidOutput(opts, result, label) {
4860
+ process.stderr.write(import_chalk12.default.green(`\u2713 ${label} \uC694\uCCAD \uC644\uB8CC (uuid: ${result.uuid})
4861
+ `));
4862
+ output(opts, {
4863
+ headers: ["field", "value"],
4864
+ rows: [["uuid", result.uuid]],
4865
+ raw: result,
4866
+ ids: [result.uuid]
4867
+ });
4868
+ }
4869
+ async function confirmDangerousAction(message, yes) {
4870
+ const isTTY = process.stdin.isTTY;
4871
+ if (!isTTY && !yes) {
4872
+ throw new NhnCloudCliError(
4873
+ "\uBE44\uB300\uD654\uD615 \uD658\uACBD\uC5D0\uC11C \uC704\uD5D8 \uC791\uC5C5\uC740 --yes \uD50C\uB798\uADF8\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4.",
4874
+ EXIT_PARAM_ERROR
4875
+ );
4876
+ }
4877
+ if (!isTTY || yes) return true;
4878
+ const { confirm } = await import("@inquirer/prompts");
4879
+ const ok = await confirm({ message, default: false });
4880
+ if (!ok) {
4881
+ process.stderr.write(import_chalk12.default.yellow("\uC791\uC5C5\uC774 \uCDE8\uC18C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.\n"));
4882
+ }
4883
+ return ok;
4884
+ }
4885
+ async function writeKubeconfigFile(path, contents, force) {
4886
+ try {
4887
+ await (0, import_promises5.writeFile)(path, contents, {
4888
+ encoding: "utf-8",
4889
+ mode: 384,
4890
+ flag: force ? "w" : "wx"
4891
+ });
4892
+ await (0, import_promises5.chmod)(path, 384);
4893
+ } catch (err) {
4894
+ if (err instanceof Error && "code" in err && err.code === "EEXIST") {
4895
+ throw new NhnCloudCliError(
4896
+ `\uD30C\uC77C\uC774 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4: ${path}. \uB36E\uC5B4\uC4F0\uB824\uBA74 --force \uB97C \uC9C0\uC815\uD558\uC138\uC694.`,
4897
+ EXIT_PARAM_ERROR
4898
+ );
4899
+ }
4900
+ throw err;
4901
+ }
4902
+ }
4903
+ var createCommand4 = new import_commander39.Command("create").description("NKS \uD074\uB7EC\uC2A4\uD130\uB97C \uC0DD\uC131\uD55C\uB2E4").requiredOption("--file <json>", "\uACF5\uC2DD API payload JSON \uD30C\uC77C").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (_opts, cmd) => {
4904
+ const opts = cmd.optsWithGlobals();
4905
+ const payload = await readJsonFile(opts.file);
4906
+ const { client } = await resolveNksClient(opts);
4907
+ startSpinner("NKS \uD074\uB7EC\uC2A4\uD130 \uC0DD\uC131 \uC694\uCCAD \uC911...");
4908
+ let result;
4909
+ try {
4910
+ result = await client.createCluster(payload);
4911
+ } catch (err) {
4912
+ stopSpinner(false);
4913
+ throw err;
4914
+ }
4915
+ stopSpinner(true);
4916
+ uuidOutput(opts, result, "\uD074\uB7EC\uC2A4\uD130 \uC0DD\uC131");
4917
+ });
4918
+ var deleteCommand3 = new import_commander39.Command("delete").description("NKS \uD074\uB7EC\uC2A4\uD130\uB97C \uC0AD\uC81C\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").option("--yes", "\uD655\uC778 \uD504\uB86C\uD504\uD2B8 \uC0DD\uB7B5 (CI/\uBE44\uB300\uD654\uD615 \uD544\uC218)").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, _opts, cmd) => {
4919
+ const opts = cmd.optsWithGlobals();
4920
+ const ok = await confirmDangerousAction(`NKS \uD074\uB7EC\uC2A4\uD130 "${cluster}" \uB97C \uC0AD\uC81C\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?`, opts.yes);
4921
+ if (!ok) return;
4922
+ const { client } = await resolveNksClient(opts);
4923
+ startSpinner("NKS \uD074\uB7EC\uC2A4\uD130 \uC0AD\uC81C \uC694\uCCAD \uC911...");
4924
+ try {
4925
+ await client.deleteCluster(cluster);
4926
+ } catch (err) {
4927
+ stopSpinner(false);
4928
+ throw err;
4929
+ }
4930
+ stopSpinner(true);
4931
+ process.stderr.write(import_chalk12.default.green(`\u2713 NKS \uD074\uB7EC\uC2A4\uD130 "${cluster}" \uC0AD\uC81C \uC694\uCCAD \uC644\uB8CC
4932
+ `));
4933
+ });
4934
+ var resizeCommand2 = new import_commander39.Command("resize").description("NKS \uD074\uB7EC\uC2A4\uD130 \uB178\uB4DC \uADF8\uB8F9 \uD06C\uAE30\uB97C \uBCC0\uACBD\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").requiredOption("--nodegroup <name-or-uuid>", "\uB178\uB4DC \uADF8\uB8F9 UUID \uB610\uB294 \uC774\uB984").requiredOption("--node-count <n>", "\uBCC0\uACBD\uD560 \uB178\uB4DC \uC218").option("--nodes-to-remove <csv>", "\uC0AD\uC81C\uD560 \uB178\uB4DC \uC774\uB984/ID CSV").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, _opts, cmd) => {
4935
+ const opts = cmd.optsWithGlobals();
4936
+ const nodeCount = parsePositiveInteger(opts.nodeCount, "--node-count");
4937
+ const nodesToRemove = opts.nodesToRemove?.split(",").map((node) => node.trim()).filter(Boolean);
4938
+ if (!nodesToRemove || nodesToRemove.length === 0) {
4939
+ process.stderr.write(import_chalk12.default.yellow("\uC8FC\uC758: --nodes-to-remove \uAC00 \uC5C6\uC73C\uBA74 \uAC10\uCD95 \uC2DC API\uAC00 \uC0AD\uC81C \uB178\uB4DC\uB97C \uC120\uD0DD\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\n"));
4940
+ }
4941
+ const { client } = await resolveNksClient(opts);
4942
+ startSpinner("NKS \uD074\uB7EC\uC2A4\uD130 resize \uC694\uCCAD \uC911...");
4943
+ let result;
4944
+ try {
4945
+ result = await client.resizeCluster({
4946
+ cluster,
4947
+ nodegroup: opts.nodegroup,
4948
+ nodeCount,
4949
+ nodesToRemove
4950
+ });
4951
+ } catch (err) {
4952
+ stopSpinner(false);
4953
+ throw err;
4954
+ }
4955
+ stopSpinner(true);
4956
+ uuidOutput(opts, result, "\uD074\uB7EC\uC2A4\uD130 resize");
4957
+ });
4958
+ var setIpAclCommand = new import_commander39.Command("set-ipacl").description("NKS \uD074\uB7EC\uC2A4\uD130 API endpoint IP ACL \uC744 \uC124\uC815\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").requiredOption("--file <json>", "\uACF5\uC2DD API payload JSON \uD30C\uC77C").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, _opts, cmd) => {
4959
+ const opts = cmd.optsWithGlobals();
4960
+ const payload = await readJsonFile(opts.file);
4961
+ const { client } = await resolveNksClient(opts);
4962
+ startSpinner("NKS IP ACL \uC124\uC815 \uC694\uCCAD \uC911...");
4963
+ let result;
4964
+ try {
4965
+ result = await client.setClusterIpAcl(cluster, payload);
4966
+ } catch (err) {
4967
+ stopSpinner(false);
4968
+ throw err;
4969
+ }
4970
+ stopSpinner(true);
4971
+ uuidOutput(opts, result, "IP ACL \uC124\uC815");
4972
+ });
4973
+ var renewCertificateCommand = new import_commander39.Command("renew-certificate").description("NKS \uD074\uB7EC\uC2A4\uD130 \uC778\uC99D\uC11C\uB97C \uAC31\uC2E0\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").requiredOption("--term-of-validity <1-5>", "\uC778\uC99D\uC11C \uC720\uD6A8 \uAE30\uAC04(\uB144)").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, _opts, cmd) => {
4974
+ const opts = cmd.optsWithGlobals();
4975
+ const term = parsePositiveInteger(opts.termOfValidity, "--term-of-validity");
4976
+ if (term < 1 || term > 5) {
4977
+ throw new NhnCloudCliError("--term-of-validity \uB294 1~5 \uC0AC\uC774\uC5EC\uC57C \uD569\uB2C8\uB2E4.", EXIT_PARAM_ERROR);
4978
+ }
4979
+ const { client } = await resolveNksClient(opts);
4980
+ startSpinner("NKS \uC778\uC99D\uC11C \uAC31\uC2E0 \uC694\uCCAD \uC911...");
4981
+ let result;
4982
+ try {
4983
+ result = await client.renewClusterCertificate(cluster, term);
4984
+ } catch (err) {
4985
+ stopSpinner(false);
4986
+ throw err;
4987
+ }
4988
+ stopSpinner(true);
4989
+ uuidOutput(opts, result, "\uC778\uC99D\uC11C \uAC31\uC2E0");
4990
+ });
4991
+ var updateSgwCommand = new import_commander39.Command("update-sgw").description("NKS \uD074\uB7EC\uC2A4\uD130 \uC11C\uBE44\uC2A4 \uAC8C\uC774\uD2B8\uC6E8\uC774\uB97C \uBCC0\uACBD\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").requiredOption("--ncr-sgw <uuid>", "NCR service gateway UUID").requiredOption("--obs-sgw <uuid>", "Object Storage service gateway UUID").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, _opts, cmd) => {
4992
+ const opts = cmd.optsWithGlobals();
4993
+ const { client } = await resolveNksClient(opts);
4994
+ startSpinner("NKS \uC11C\uBE44\uC2A4 \uAC8C\uC774\uD2B8\uC6E8\uC774 \uBCC0\uACBD \uC694\uCCAD \uC911...");
4995
+ let result;
4996
+ try {
4997
+ result = await client.updateClusterServiceGateway(cluster, opts.ncrSgw, opts.obsSgw);
4998
+ } catch (err) {
4999
+ stopSpinner(false);
5000
+ throw err;
5001
+ }
5002
+ stopSpinner(true);
5003
+ uuidOutput(opts, result, "\uC11C\uBE44\uC2A4 \uAC8C\uC774\uD2B8\uC6E8\uC774 \uBCC0\uACBD");
5004
+ });
5005
+ var setControlPlaneLogCommand = new import_commander39.Command("set-control-plane-log").description("NKS \uD074\uB7EC\uC2A4\uD130 control plane log \uC124\uC815\uC744 \uBCC0\uACBD\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").requiredOption("--file <json>", "control_plane_log \uAC1D\uCCB4 JSON \uD30C\uC77C").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, _opts, cmd) => {
5006
+ const opts = cmd.optsWithGlobals();
5007
+ const controlPlaneLog = await readJsonFile(opts.file);
5008
+ const { client } = await resolveNksClient(opts);
5009
+ startSpinner("NKS control plane log \uC124\uC815 \uC694\uCCAD \uC911...");
5010
+ let result;
5011
+ try {
5012
+ result = await client.setControlPlaneLog(cluster, controlPlaneLog);
5013
+ } catch (err) {
5014
+ stopSpinner(false);
5015
+ throw err;
5016
+ }
5017
+ stopSpinner(true);
5018
+ uuidOutput(opts, result, "control plane log \uC124\uC815");
5019
+ });
5020
+ var getCommand4 = new import_commander39.Command("get").description("NKS \uD074\uB7EC\uC2A4\uD130\uB97C \uC870\uD68C\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, _opts, cmd) => {
5021
+ const opts = cmd.optsWithGlobals();
5022
+ const { client } = await resolveNksClient(opts);
5023
+ startSpinner("NKS \uD074\uB7EC\uC2A4\uD130 \uC870\uD68C \uC911...");
5024
+ let result;
5025
+ try {
5026
+ result = await client.getCluster(cluster);
5027
+ } catch (err) {
5028
+ stopSpinner(false);
5029
+ throw err;
5030
+ }
5031
+ stopSpinner(true);
5032
+ output(opts, {
5033
+ headers: ["id", "name", "status"],
5034
+ rows: [resourceRow(result)],
5035
+ raw: result,
5036
+ ids: [resourceId(result)]
5037
+ });
5038
+ });
5039
+ var eventsCommand = new import_commander39.Command("events").description("NKS \uD074\uB7EC\uC2A4\uD130 \uC791\uC5C5 \uC774\uB825\uC744 \uC870\uD68C\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, _opts, cmd) => {
5040
+ const opts = cmd.optsWithGlobals();
5041
+ const { client } = await resolveNksClient(opts);
5042
+ startSpinner("NKS \uD074\uB7EC\uC2A4\uD130 \uC791\uC5C5 \uC774\uB825 \uC870\uD68C \uC911...");
5043
+ let events;
5044
+ try {
5045
+ events = await client.listClusterEvents(cluster);
5046
+ } catch (err) {
5047
+ stopSpinner(false);
5048
+ throw err;
5049
+ }
5050
+ stopSpinner(true);
5051
+ output(opts, {
5052
+ headers: ["id", "name", "status"],
5053
+ rows: events.map(resourceRow),
5054
+ raw: events,
5055
+ ids: events.map(resourceId)
5056
+ });
5057
+ });
5058
+ var eventCommand = new import_commander39.Command("event").description("NKS \uD074\uB7EC\uC2A4\uD130 \uC791\uC5C5 \uC774\uB825 \uB2E8\uAC74\uC744 \uC870\uD68C\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").argument("<event>", "\uC791\uC5C5 \uC774\uB825 UUID \uB610\uB294 ID").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, event, _opts, cmd) => {
5059
+ const opts = cmd.optsWithGlobals();
5060
+ const { client } = await resolveNksClient(opts);
5061
+ startSpinner("NKS \uD074\uB7EC\uC2A4\uD130 \uC791\uC5C5 \uC774\uB825 \uC870\uD68C \uC911...");
5062
+ let result;
5063
+ try {
5064
+ result = await client.getClusterEvent(cluster, event);
5065
+ } catch (err) {
5066
+ stopSpinner(false);
5067
+ throw err;
5068
+ }
5069
+ stopSpinner(true);
5070
+ output(opts, {
5071
+ headers: ["id", "name", "status"],
5072
+ rows: [resourceRow(result)],
5073
+ raw: result,
5074
+ ids: [resourceId(result)]
5075
+ });
5076
+ });
5077
+ var kubeconfigCommand = new import_commander39.Command("kubeconfig").description("NKS \uD074\uB7EC\uC2A4\uD130 kubeconfig \uB97C \uCD9C\uB825\uD558\uAC70\uB098 \uC800\uC7A5\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").option("--output <file>", "kubeconfig \uC800\uC7A5 \uACBD\uB85C").option("--force", "\uAE30\uC874 \uD30C\uC77C \uB36E\uC5B4\uC4F0\uAE30").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, _opts, cmd) => {
5078
+ const opts = cmd.optsWithGlobals();
5079
+ const { client } = await resolveNksClient(opts);
5080
+ startSpinner("NKS kubeconfig \uC870\uD68C \uC911...");
5081
+ let kubeconfig;
5082
+ try {
5083
+ kubeconfig = await client.getClusterKubeconfig(cluster);
5084
+ } catch (err) {
5085
+ stopSpinner(false);
5086
+ throw err;
5087
+ }
5088
+ stopSpinner(true);
5089
+ if (opts.output) {
5090
+ await writeKubeconfigFile(opts.output, kubeconfig, opts.force);
5091
+ process.stderr.write(import_chalk12.default.green(`\u2713 kubeconfig \uB97C \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4: ${opts.output}
5092
+ `));
5093
+ return;
5094
+ }
5095
+ process.stdout.write(kubeconfig.endsWith("\n") ? kubeconfig : kubeconfig + "\n");
5096
+ });
5097
+ var ipAclCommand = new import_commander39.Command("ipacl").description("NKS \uD074\uB7EC\uC2A4\uD130 API endpoint IP ACL \uC744 \uC870\uD68C\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, _opts, cmd) => {
5098
+ const opts = cmd.optsWithGlobals();
5099
+ const { client } = await resolveNksClient(opts);
5100
+ startSpinner("NKS IP ACL \uC870\uD68C \uC911...");
5101
+ let result;
5102
+ try {
5103
+ result = await client.getClusterIpAcl(cluster);
5104
+ } catch (err) {
5105
+ stopSpinner(false);
5106
+ throw err;
5107
+ }
5108
+ stopSpinner(true);
5109
+ output(opts, {
5110
+ headers: ["cluster_uuid", "enable", "action", "target_count"],
5111
+ rows: [clusterIpAclRow(result)],
5112
+ raw: result,
5113
+ ids: [result.cluster_uuid]
5114
+ });
5115
+ });
5116
+ var clusterAddonListCommand = new import_commander39.Command("list").description("NKS \uD074\uB7EC\uC2A4\uD130\uC5D0 \uC124\uCE58\uB41C \uC560\uB4DC\uC628 \uBAA9\uB85D\uC744 \uC870\uD68C\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, _opts, cmd) => {
5117
+ const opts = cmd.optsWithGlobals();
5118
+ const { client } = await resolveNksClient(opts);
5119
+ startSpinner("NKS \uD074\uB7EC\uC2A4\uD130 \uC560\uB4DC\uC628 \uBAA9\uB85D \uC870\uD68C \uC911...");
5120
+ let addons;
5121
+ try {
5122
+ addons = await client.listClusterAddons(cluster);
5123
+ } catch (err) {
5124
+ stopSpinner(false);
5125
+ throw err;
5126
+ }
5127
+ stopSpinner(true);
5128
+ output(opts, {
5129
+ headers: ["id", "name", "version", "status"],
5130
+ rows: addons.map(addonRow),
5131
+ raw: addons,
5132
+ ids: addons.map((addon) => addon.uuid ?? addon.id ?? addon.name)
5133
+ });
5134
+ });
5135
+ var clusterAddonGetCommand = new import_commander39.Command("get").description("NKS \uD074\uB7EC\uC2A4\uD130\uC5D0 \uC124\uCE58\uB41C \uC560\uB4DC\uC628\uC744 \uC870\uD68C\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").argument("<addon>", "\uC560\uB4DC\uC628 UUID \uB610\uB294 \uC774\uB984").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, addon, _opts, cmd) => {
5136
+ const opts = cmd.optsWithGlobals();
5137
+ const { client } = await resolveNksClient(opts);
5138
+ startSpinner("NKS \uD074\uB7EC\uC2A4\uD130 \uC560\uB4DC\uC628 \uC870\uD68C \uC911...");
5139
+ let result;
5140
+ try {
5141
+ result = await client.getClusterAddon(cluster, addon);
5142
+ } catch (err) {
5143
+ stopSpinner(false);
5144
+ throw err;
5145
+ }
5146
+ stopSpinner(true);
5147
+ output(opts, {
5148
+ headers: ["id", "name", "version", "status"],
5149
+ rows: [addonRow(result)],
5150
+ raw: result,
5151
+ ids: [result.uuid ?? result.id ?? result.name]
5152
+ });
5153
+ });
5154
+ function parseResolveConflicts(value) {
5155
+ if (value === "none" || value === "overwrite" || value === "preserve") {
5156
+ return value;
5157
+ }
5158
+ throw new NhnCloudCliError(
5159
+ `--resolve-conflicts \uB294 none, overwrite, preserve \uC911 \uD558\uB098\uC5EC\uC57C \uD569\uB2C8\uB2E4: ${JSON.stringify(value)}`,
5160
+ EXIT_PARAM_ERROR
5161
+ );
5162
+ }
5163
+ var clusterAddonInstallCommand = new import_commander39.Command("install").description("NKS \uD074\uB7EC\uC2A4\uD130 \uC560\uB4DC\uC628\uC744 \uC124\uCE58\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").requiredOption("--name <name>", "\uC560\uB4DC\uC628 \uC774\uB984").requiredOption("--version <version>", "\uC560\uB4DC\uC628 \uBC84\uC804").requiredOption("--resolve-conflicts <none|overwrite|preserve>", "\uCDA9\uB3CC \uD574\uACB0 \uC815\uCC45").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, _opts, cmd) => {
5164
+ const opts = cmd.optsWithGlobals();
5165
+ const resolveConflicts = parseResolveConflicts(opts.resolveConflicts);
5166
+ const { client } = await resolveNksClient(opts);
5167
+ startSpinner("NKS \uD074\uB7EC\uC2A4\uD130 \uC560\uB4DC\uC628 \uC124\uCE58 \uC694\uCCAD \uC911...");
5168
+ let result;
5169
+ try {
5170
+ result = await client.installClusterAddon(cluster, {
5171
+ name: opts.name,
5172
+ version: opts.version,
5173
+ resolveConflicts
5174
+ });
5175
+ } catch (err) {
5176
+ stopSpinner(false);
5177
+ throw err;
5178
+ }
5179
+ stopSpinner(true);
5180
+ uuidOutput(opts, result, "\uD074\uB7EC\uC2A4\uD130 \uC560\uB4DC\uC628 \uC124\uCE58");
5181
+ });
5182
+ var clusterAddonUpdateCommand = new import_commander39.Command("update").description("NKS \uD074\uB7EC\uC2A4\uD130 \uC560\uB4DC\uC628\uC744 \uC5C5\uB370\uC774\uD2B8\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").argument("<addon>", "\uC560\uB4DC\uC628 UUID \uB610\uB294 \uC774\uB984").requiredOption("--version <version>", "\uC560\uB4DC\uC628 \uBC84\uC804").requiredOption("--resolve-conflicts <none|overwrite|preserve>", "\uCDA9\uB3CC \uD574\uACB0 \uC815\uCC45").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, addon, _opts, cmd) => {
5183
+ const opts = cmd.optsWithGlobals();
5184
+ const resolveConflicts = parseResolveConflicts(opts.resolveConflicts);
5185
+ const { client } = await resolveNksClient(opts);
5186
+ startSpinner("NKS \uD074\uB7EC\uC2A4\uD130 \uC560\uB4DC\uC628 \uC5C5\uB370\uC774\uD2B8 \uC694\uCCAD \uC911...");
5187
+ let result;
5188
+ try {
5189
+ result = await client.updateClusterAddon(cluster, addon, {
5190
+ version: opts.version,
5191
+ resolveConflicts
5192
+ });
5193
+ } catch (err) {
5194
+ stopSpinner(false);
5195
+ throw err;
5196
+ }
5197
+ stopSpinner(true);
5198
+ uuidOutput(opts, result, "\uD074\uB7EC\uC2A4\uD130 \uC560\uB4DC\uC628 \uC5C5\uB370\uC774\uD2B8");
5199
+ });
5200
+ var clusterAddonRemoveCommand = new import_commander39.Command("remove").description("NKS \uD074\uB7EC\uC2A4\uD130 \uC560\uB4DC\uC628\uC744 \uC81C\uAC70\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").argument("<addon>", "\uC560\uB4DC\uC628 UUID \uB610\uB294 \uC774\uB984").option("--yes", "\uD655\uC778 \uD504\uB86C\uD504\uD2B8 \uC0DD\uB7B5 (CI/\uBE44\uB300\uD654\uD615 \uD544\uC218)").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, addon, _opts, cmd) => {
5201
+ const opts = cmd.optsWithGlobals();
5202
+ const ok = await confirmDangerousAction(`NKS \uD074\uB7EC\uC2A4\uD130 \uC560\uB4DC\uC628 "${addon}" \uC744 \uC81C\uAC70\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?`, opts.yes);
5203
+ if (!ok) return;
5204
+ const { client } = await resolveNksClient(opts);
5205
+ startSpinner("NKS \uD074\uB7EC\uC2A4\uD130 \uC560\uB4DC\uC628 \uC81C\uAC70 \uC694\uCCAD \uC911...");
5206
+ let result;
5207
+ try {
5208
+ result = await client.removeClusterAddon(cluster, addon);
5209
+ } catch (err) {
5210
+ stopSpinner(false);
5211
+ throw err;
5212
+ }
5213
+ stopSpinner(true);
5214
+ uuidOutput(opts, result, "\uD074\uB7EC\uC2A4\uD130 \uC560\uB4DC\uC628 \uC81C\uAC70");
5215
+ });
5216
+ var clusterAddonCommand = new import_commander39.Command("addon").description("NKS \uD074\uB7EC\uC2A4\uD130 \uC560\uB4DC\uC628 \uAD00\uB828 \uBA85\uB839").addCommand(clusterAddonListCommand).addCommand(clusterAddonGetCommand).addCommand(clusterAddonInstallCommand).addCommand(clusterAddonUpdateCommand).addCommand(clusterAddonRemoveCommand);
5217
+ var clusterCommand = new import_commander39.Command("cluster").description("NKS \uD074\uB7EC\uC2A4\uD130 \uAD00\uB828 \uBA85\uB839").addCommand(listCommand6).addCommand(getCommand4).addCommand(createCommand4).addCommand(deleteCommand3).addCommand(resizeCommand2).addCommand(eventsCommand).addCommand(eventCommand).addCommand(kubeconfigCommand).addCommand(ipAclCommand).addCommand(setIpAclCommand).addCommand(renewCertificateCommand).addCommand(updateSgwCommand).addCommand(setControlPlaneLogCommand).addCommand(clusterAddonCommand);
5218
+
5219
+ // src/commands/nks/nodegroup.ts
5220
+ var import_commander40 = require("commander");
5221
+ var import_chalk13 = __toESM(require("chalk"));
5222
+ function nodeGroupRow(nodegroup) {
5223
+ return [
5224
+ nodegroup.uuid,
5225
+ nodegroup.name,
5226
+ nodegroup.status,
5227
+ String(nodegroup["node_count"] ?? ""),
5228
+ String(nodegroup["flavor_id"] ?? "")
5229
+ ];
5230
+ }
5231
+ function rawObjectRows(resource) {
5232
+ return Object.entries(resource).map(([key, value]) => [
5233
+ key,
5234
+ typeof value === "object" && value !== null ? JSON.stringify(value) : String(value)
5235
+ ]);
5236
+ }
5237
+ function uuidOutput2(opts, result, label) {
5238
+ process.stderr.write(import_chalk13.default.green(`\u2713 ${label} \uC694\uCCAD \uC644\uB8CC (uuid: ${result.uuid})
5239
+ `));
5240
+ output(opts, {
5241
+ headers: ["field", "value"],
5242
+ rows: [["uuid", result.uuid]],
5243
+ raw: result,
5244
+ ids: [result.uuid]
5245
+ });
5246
+ }
5247
+ function parseCsv(value, optionName) {
5248
+ const values = value.split(",").map((item) => item.trim()).filter(Boolean);
5249
+ if (values.length === 0) {
5250
+ throw new NhnCloudCliError(`${optionName} \uB294 \uBE44\uC5B4 \uC788\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.`, EXIT_PARAM_ERROR);
5251
+ }
5252
+ return values;
5253
+ }
5254
+ function optionalPositiveInteger(value, optionName) {
5255
+ return value === void 0 ? void 0 : parsePositiveInteger(value, optionName);
5256
+ }
5257
+ function optionalNonNegativeInteger(value, optionName) {
5258
+ return value === void 0 ? void 0 : parseNonNegativeInteger(value, optionName);
5259
+ }
5260
+ async function confirmDangerousAction2(message, yes) {
5261
+ const isTTY = process.stdin.isTTY;
5262
+ if (!isTTY && !yes) {
5263
+ throw new NhnCloudCliError(
5264
+ "\uBE44\uB300\uD654\uD615 \uD658\uACBD\uC5D0\uC11C \uC704\uD5D8 \uC791\uC5C5\uC740 --yes \uD50C\uB798\uADF8\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4.",
5265
+ EXIT_PARAM_ERROR
5266
+ );
5267
+ }
5268
+ if (!isTTY || yes) return true;
5269
+ const { confirm } = await import("@inquirer/prompts");
5270
+ const ok = await confirm({ message, default: false });
5271
+ if (!ok) process.stderr.write(import_chalk13.default.yellow("\uC791\uC5C5\uC774 \uCDE8\uC18C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.\n"));
5272
+ return ok;
5273
+ }
5274
+ var listCommand7 = new import_commander40.Command("list").description("NKS \uB178\uB4DC \uADF8\uB8F9 \uBAA9\uB85D\uC744 \uC870\uD68C\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, _opts, cmd) => {
5275
+ const opts = cmd.optsWithGlobals();
5276
+ const { client } = await resolveNksClient(opts);
5277
+ startSpinner("NKS \uB178\uB4DC \uADF8\uB8F9 \uBAA9\uB85D \uC870\uD68C \uC911...");
5278
+ let nodegroups;
5279
+ try {
5280
+ nodegroups = await client.listNodeGroups(cluster);
5281
+ } catch (err) {
5282
+ stopSpinner(false);
5283
+ throw err;
5284
+ }
5285
+ stopSpinner(true);
5286
+ output(opts, {
5287
+ headers: ["uuid", "name", "status", "node_count", "flavor_id"],
5288
+ rows: nodegroups.map(nodeGroupRow),
5289
+ raw: nodegroups,
5290
+ ids: nodegroups.map((nodegroup) => nodegroup.uuid)
5291
+ });
5292
+ });
5293
+ var getCommand5 = new import_commander40.Command("get").description("NKS \uB178\uB4DC \uADF8\uB8F9\uC744 \uC870\uD68C\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").argument("<nodegroup>", "\uB178\uB4DC \uADF8\uB8F9 UUID \uB610\uB294 \uC774\uB984").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, nodegroup, _opts, cmd) => {
5294
+ const opts = cmd.optsWithGlobals();
5295
+ const { client } = await resolveNksClient(opts);
5296
+ startSpinner("NKS \uB178\uB4DC \uADF8\uB8F9 \uC870\uD68C \uC911...");
5297
+ let result;
5298
+ try {
5299
+ result = await client.getNodeGroup(cluster, nodegroup);
5300
+ } catch (err) {
5301
+ stopSpinner(false);
5302
+ throw err;
5303
+ }
5304
+ stopSpinner(true);
5305
+ output(opts, {
5306
+ headers: ["uuid", "name", "status", "node_count", "flavor_id"],
5307
+ rows: [nodeGroupRow(result)],
5308
+ raw: result,
5309
+ ids: [result.uuid]
5310
+ });
5311
+ });
5312
+ var createCommand5 = new import_commander40.Command("create").description("NKS \uB178\uB4DC \uADF8\uB8F9\uC744 \uC0DD\uC131\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").requiredOption("--file <json>", "\uACF5\uC2DD API payload JSON \uD30C\uC77C").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, _opts, cmd) => {
5313
+ const opts = cmd.optsWithGlobals();
5314
+ const payload = await readJsonFile(opts.file);
5315
+ const { client } = await resolveNksClient(opts);
5316
+ startSpinner("NKS \uB178\uB4DC \uADF8\uB8F9 \uC0DD\uC131 \uC694\uCCAD \uC911...");
5317
+ let result;
5318
+ try {
5319
+ result = await client.createNodeGroup(cluster, payload);
5320
+ } catch (err) {
5321
+ stopSpinner(false);
5322
+ throw err;
5323
+ }
5324
+ stopSpinner(true);
5325
+ uuidOutput2(opts, result, "\uB178\uB4DC \uADF8\uB8F9 \uC0DD\uC131");
5326
+ });
5327
+ var deleteCommand4 = new import_commander40.Command("delete").description("NKS \uB178\uB4DC \uADF8\uB8F9\uC744 \uC0AD\uC81C\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").argument("<nodegroup>", "\uB178\uB4DC \uADF8\uB8F9 UUID \uB610\uB294 \uC774\uB984").option("--yes", "\uD655\uC778 \uD504\uB86C\uD504\uD2B8 \uC0DD\uB7B5 (CI/\uBE44\uB300\uD654\uD615 \uD544\uC218)").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, nodegroup, _opts, cmd) => {
5328
+ const opts = cmd.optsWithGlobals();
5329
+ const ok = await confirmDangerousAction2(`NKS \uB178\uB4DC \uADF8\uB8F9 "${nodegroup}" \uB97C \uC0AD\uC81C\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?`, opts.yes);
5330
+ if (!ok) return;
5331
+ const { client } = await resolveNksClient(opts);
5332
+ startSpinner("NKS \uB178\uB4DC \uADF8\uB8F9 \uC0AD\uC81C \uC694\uCCAD \uC911...");
5333
+ try {
5334
+ await client.deleteNodeGroup(cluster, nodegroup);
5335
+ } catch (err) {
5336
+ stopSpinner(false);
5337
+ throw err;
5338
+ }
5339
+ stopSpinner(true);
5340
+ process.stderr.write(import_chalk13.default.green(`\u2713 NKS \uB178\uB4DC \uADF8\uB8F9 "${nodegroup}" \uC0AD\uC81C \uC694\uCCAD \uC644\uB8CC
5341
+ `));
5342
+ });
5343
+ function nodeActionCommand(name) {
5344
+ return new import_commander40.Command(name).description(`NKS \uB178\uB4DC \uADF8\uB8F9 \uB178\uB4DC\uB97C ${name === "stop-node" ? "\uC911\uC9C0" : "\uC2DC\uC791"}\uD55C\uB2E4`).argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").argument("<nodegroup>", "\uB178\uB4DC \uADF8\uB8F9 UUID \uB610\uB294 \uC774\uB984").requiredOption("--nodes <csv>", "\uB300\uC0C1 \uB178\uB4DC CSV").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, nodegroup, _opts, cmd) => {
5345
+ const opts = cmd.optsWithGlobals();
5346
+ const nodes = parseCsv(opts.nodes, "--nodes");
5347
+ const { client } = await resolveNksClient(opts);
5348
+ startSpinner(`NKS \uB178\uB4DC ${name === "stop-node" ? "\uC911\uC9C0" : "\uC2DC\uC791"} \uC694\uCCAD \uC911...`);
5349
+ let result;
5350
+ try {
5351
+ result = name === "stop-node" ? await client.stopNodeGroupNodes(cluster, nodegroup, nodes) : await client.startNodeGroupNodes(cluster, nodegroup, nodes);
5352
+ } catch (err) {
5353
+ stopSpinner(false);
5354
+ throw err;
5355
+ }
5356
+ stopSpinner(true);
5357
+ uuidOutput2(opts, result, `\uB178\uB4DC ${name === "stop-node" ? "\uC911\uC9C0" : "\uC2DC\uC791"}`);
5358
+ });
5359
+ }
5360
+ var autoscaleCommand = new import_commander40.Command("autoscale").description("NKS \uB178\uB4DC \uADF8\uB8F9 autoscale \uC124\uC815\uC744 \uC870\uD68C\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").argument("<nodegroup>", "\uB178\uB4DC \uADF8\uB8F9 UUID \uB610\uB294 \uC774\uB984").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, nodegroup, _opts, cmd) => {
5361
+ const opts = cmd.optsWithGlobals();
5362
+ const { client } = await resolveNksClient(opts);
5363
+ startSpinner("NKS \uB178\uB4DC \uADF8\uB8F9 autoscale \uC870\uD68C \uC911...");
5364
+ let result;
5365
+ try {
5366
+ result = await client.getNodeGroupAutoscale(cluster, nodegroup);
5367
+ } catch (err) {
5368
+ stopSpinner(false);
5369
+ throw err;
5370
+ }
5371
+ stopSpinner(true);
5372
+ output(opts, {
5373
+ headers: ["field", "value"],
5374
+ rows: rawObjectRows(result),
5375
+ raw: result,
5376
+ ids: []
5377
+ });
5378
+ });
5379
+ var setAutoscaleCommand = new import_commander40.Command("set-autoscale").description("NKS \uB178\uB4DC \uADF8\uB8F9 autoscale \uC124\uC815\uC744 \uBCC0\uACBD\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").argument("<nodegroup>", "\uB178\uB4DC \uADF8\uB8F9 UUID \uB610\uB294 \uC774\uB984").requiredOption("--file <json>", "\uACF5\uC2DD API payload JSON \uD30C\uC77C").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, nodegroup, _opts, cmd) => {
5380
+ const opts = cmd.optsWithGlobals();
5381
+ const payload = await readJsonFile(opts.file);
5382
+ const { client } = await resolveNksClient(opts);
5383
+ startSpinner("NKS \uB178\uB4DC \uADF8\uB8F9 autoscale \uBCC0\uACBD \uC694\uCCAD \uC911...");
5384
+ let result;
5385
+ try {
5386
+ result = await client.setNodeGroupAutoscale(cluster, nodegroup, payload);
5387
+ } catch (err) {
5388
+ stopSpinner(false);
5389
+ throw err;
5390
+ }
5391
+ stopSpinner(true);
5392
+ uuidOutput2(opts, result, "autoscale \uBCC0\uACBD");
5393
+ });
5394
+ var setMetricAutoscaleCommand = new import_commander40.Command("set-metric-autoscale").description("NKS \uB178\uB4DC \uADF8\uB8F9 metric autoscale \uC124\uC815\uC744 \uBCC0\uACBD\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").argument("<nodegroup>", "\uB178\uB4DC \uADF8\uB8F9 UUID \uB610\uB294 \uC774\uB984").requiredOption("--file <json>", "\uACF5\uC2DD API payload JSON \uD30C\uC77C").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, nodegroup, _opts, cmd) => {
5395
+ const opts = cmd.optsWithGlobals();
5396
+ const payload = await readJsonFile(opts.file);
5397
+ const { client } = await resolveNksClient(opts);
5398
+ startSpinner("NKS metric autoscale \uBCC0\uACBD \uC694\uCCAD \uC911...");
5399
+ let result;
5400
+ try {
5401
+ result = await client.setNodeGroupMetricAutoscale(cluster, nodegroup, payload);
5402
+ } catch (err) {
5403
+ stopSpinner(false);
5404
+ throw err;
5405
+ }
5406
+ stopSpinner(true);
5407
+ uuidOutput2(opts, result, "metric autoscale \uBCC0\uACBD");
5408
+ });
5409
+ var upgradeCommand = new import_commander40.Command("upgrade").description("NKS \uB178\uB4DC \uADF8\uB8F9 Kubernetes version \uC744 \uC5C5\uADF8\uB808\uC774\uB4DC\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").argument("<nodegroup>", "\uB178\uB4DC \uADF8\uB8F9 UUID \uB610\uB294 \uC774\uB984").requiredOption("--version <v>", "\uB300\uC0C1 Kubernetes version").option("--num-buffer-nodes <n>", "buffer node \uC218").option("--num-max-unavailable-nodes <n>", "\uCD5C\uB300 unavailable node \uC218").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, nodegroup, _opts, cmd) => {
5410
+ const opts = cmd.optsWithGlobals();
5411
+ const { client } = await resolveNksClient(opts);
5412
+ startSpinner("NKS \uB178\uB4DC \uADF8\uB8F9 upgrade \uC694\uCCAD \uC911...");
5413
+ let result;
5414
+ try {
5415
+ result = await client.upgradeNodeGroup(cluster, nodegroup, {
5416
+ version: opts.version,
5417
+ numBufferNodes: optionalNonNegativeInteger(opts.numBufferNodes, "--num-buffer-nodes"),
5418
+ numMaxUnavailableNodes: optionalPositiveInteger(opts.numMaxUnavailableNodes, "--num-max-unavailable-nodes")
5419
+ });
5420
+ } catch (err) {
5421
+ stopSpinner(false);
5422
+ throw err;
5423
+ }
5424
+ stopSpinner(true);
5425
+ uuidOutput2(opts, result, "\uB178\uB4DC \uADF8\uB8F9 upgrade");
5426
+ });
5427
+ var setUserscriptCommand = new import_commander40.Command("set-userscript").description("NKS \uB178\uB4DC \uADF8\uB8F9 user script \uB97C \uBCC0\uACBD\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").argument("<nodegroup>", "\uB178\uB4DC \uADF8\uB8F9 UUID \uB610\uB294 \uC774\uB984").requiredOption("--file <script>", "script \uD30C\uC77C").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, nodegroup, _opts, cmd) => {
5428
+ const opts = cmd.optsWithGlobals();
5429
+ const contents = await readTextFile(opts.file);
5430
+ const { client } = await resolveNksClient(opts);
5431
+ startSpinner("NKS node user script \uBCC0\uACBD \uC694\uCCAD \uC911...");
5432
+ let result;
5433
+ try {
5434
+ result = await client.setNodeGroupUserscript(cluster, nodegroup, contents);
5435
+ } catch (err) {
5436
+ stopSpinner(false);
5437
+ throw err;
5438
+ }
5439
+ stopSpinner(true);
5440
+ uuidOutput2(opts, result, "user script \uBCC0\uACBD");
5441
+ });
5442
+ var updateFlavorCommand = new import_commander40.Command("update-flavor").description("NKS \uB178\uB4DC \uADF8\uB8F9 flavor \uB97C \uBCC0\uACBD\uD55C\uB2E4").argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").argument("<nodegroup>", "\uB178\uB4DC \uADF8\uB8F9 UUID \uB610\uB294 \uC774\uB984").requiredOption("--flavor <uuid>", "\uBCC0\uACBD\uD560 flavor UUID").option("--num-buffer-nodes <n>", "buffer node \uC218").option("--num-max-unavailable-nodes <n>", "\uCD5C\uB300 unavailable node \uC218").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, nodegroup, _opts, cmd) => {
5443
+ const opts = cmd.optsWithGlobals();
5444
+ const { client } = await resolveNksClient(opts);
5445
+ startSpinner("NKS \uB178\uB4DC \uADF8\uB8F9 flavor \uBCC0\uACBD \uC694\uCCAD \uC911...");
5446
+ let result;
5447
+ try {
5448
+ result = await client.updateNodeGroupFlavor(cluster, nodegroup, {
5449
+ flavorId: opts.flavor,
5450
+ numBufferNodes: optionalNonNegativeInteger(opts.numBufferNodes, "--num-buffer-nodes"),
5451
+ numMaxUnavailableNodes: optionalPositiveInteger(opts.numMaxUnavailableNodes, "--num-max-unavailable-nodes")
5452
+ });
5453
+ } catch (err) {
5454
+ stopSpinner(false);
5455
+ throw err;
5456
+ }
5457
+ stopSpinner(true);
5458
+ uuidOutput2(opts, result, "flavor \uBCC0\uACBD");
5459
+ });
5460
+ function patchPayloadCommand(name) {
5461
+ return new import_commander40.Command(name).description(`NKS \uB178\uB4DC \uADF8\uB8F9 ${name === "set-fip-auto-bind" ? "Floating IP \uC790\uB3D9 \uC5F0\uACB0" : "Kubernetes labels"} \uC124\uC815\uC744 \uBCC0\uACBD\uD55C\uB2E4`).argument("<cluster>", "\uD074\uB7EC\uC2A4\uD130 UUID \uB610\uB294 \uC774\uB984").argument("<nodegroup>", "\uB178\uB4DC \uADF8\uB8F9 UUID \uB610\uB294 \uC774\uB984").requiredOption("--file <json>", "\uACF5\uC2DD API payload JSON \uD30C\uC77C").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (cluster, nodegroup, _opts, cmd) => {
5462
+ const opts = cmd.optsWithGlobals();
5463
+ const payload = await readJsonFile(opts.file);
5464
+ const { client } = await resolveNksClient(opts);
5465
+ startSpinner(`NKS \uB178\uB4DC \uADF8\uB8F9 ${name} \uC694\uCCAD \uC911...`);
5466
+ let result;
5467
+ try {
5468
+ result = name === "set-fip-auto-bind" ? await client.setNodeGroupFipAutoBind(cluster, nodegroup, payload) : await client.setNodeGroupLabels(cluster, nodegroup, payload);
5469
+ } catch (err) {
5470
+ stopSpinner(false);
5471
+ throw err;
5472
+ }
5473
+ stopSpinner(true);
5474
+ uuidOutput2(opts, result, name);
5475
+ });
5476
+ }
5477
+ var nodegroupCommand = new import_commander40.Command("nodegroup").description("NKS \uB178\uB4DC \uADF8\uB8F9 \uAD00\uB828 \uBA85\uB839").addCommand(listCommand7).addCommand(getCommand5).addCommand(createCommand5).addCommand(deleteCommand4).addCommand(nodeActionCommand("stop-node")).addCommand(nodeActionCommand("start-node")).addCommand(autoscaleCommand).addCommand(setAutoscaleCommand).addCommand(setMetricAutoscaleCommand).addCommand(upgradeCommand).addCommand(setUserscriptCommand).addCommand(updateFlavorCommand).addCommand(patchPayloadCommand("set-fip-auto-bind")).addCommand(patchPayloadCommand("set-labels"));
5478
+
5479
+ // src/commands/nks/addon.ts
5480
+ var import_commander41 = require("commander");
5481
+ function addonTypeRow(addonType) {
5482
+ return [
5483
+ addonType.uuid ?? addonType.id ?? addonType.name,
5484
+ addonType.name,
5485
+ String(addonType["version"] ?? "")
5486
+ ];
5487
+ }
5488
+ function addonRow2(addon) {
5489
+ return [
5490
+ addon.uuid ?? addon.id ?? addon.name,
5491
+ addon.name,
5492
+ addon.version ?? "",
5493
+ addon.status ?? ""
5494
+ ];
5495
+ }
5496
+ var addonTypeListCommand = new import_commander41.Command("list").description("NKS \uC560\uB4DC\uC628 \uD0C0\uC785 \uBAA9\uB85D\uC744 \uC870\uD68C\uD55C\uB2E4").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (_opts, cmd) => {
5497
+ const opts = cmd.optsWithGlobals();
5498
+ const { client } = await resolveNksClient(opts);
5499
+ startSpinner("NKS \uC560\uB4DC\uC628 \uD0C0\uC785 \uBAA9\uB85D \uC870\uD68C \uC911...");
5500
+ let addonTypes;
5501
+ try {
5502
+ addonTypes = await client.listAddonTypes();
5503
+ } catch (err) {
5504
+ stopSpinner(false);
5505
+ throw err;
5506
+ }
5507
+ stopSpinner(true);
5508
+ output(opts, {
5509
+ headers: ["id", "name", "version"],
5510
+ rows: addonTypes.map(addonTypeRow),
5511
+ raw: addonTypes,
5512
+ ids: addonTypes.map((addonType) => addonType.uuid ?? addonType.id ?? addonType.name)
5513
+ });
5514
+ });
5515
+ var addonTypeGetCommand = new import_commander41.Command("get").description("NKS \uC560\uB4DC\uC628 \uD0C0\uC785\uC744 \uC870\uD68C\uD55C\uB2E4").argument("<addon-type>", "\uC560\uB4DC\uC628 \uD0C0\uC785 UUID \uB610\uB294 \uC774\uB984").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (addonType, _opts, cmd) => {
5516
+ const opts = cmd.optsWithGlobals();
5517
+ const { client } = await resolveNksClient(opts);
5518
+ startSpinner("NKS \uC560\uB4DC\uC628 \uD0C0\uC785 \uC870\uD68C \uC911...");
5519
+ let result;
5520
+ try {
5521
+ result = await client.getAddonType(addonType);
5522
+ } catch (err) {
5523
+ stopSpinner(false);
5524
+ throw err;
5525
+ }
5526
+ stopSpinner(true);
5527
+ output(opts, {
5528
+ headers: ["id", "name", "version"],
5529
+ rows: [addonTypeRow(result)],
5530
+ raw: result,
5531
+ ids: [result.uuid ?? result.id ?? result.name]
5532
+ });
5533
+ });
5534
+ var addonTypeCommand = new import_commander41.Command("addon-type").description("NKS \uC560\uB4DC\uC628 \uD0C0\uC785 \uAD00\uB828 \uBA85\uB839").addCommand(addonTypeListCommand).addCommand(addonTypeGetCommand);
5535
+ var addonListCommand = new import_commander41.Command("list").description("NKS \uC560\uB4DC\uC628 \uBAA9\uB85D\uC744 \uC870\uD68C\uD55C\uB2E4").option("--k8s-version <version>", "Kubernetes version filter").option("--image <image>", "image filter").option("--platform-version <version>", "platform version filter").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (_opts, cmd) => {
5536
+ const opts = cmd.optsWithGlobals();
5537
+ const { client } = await resolveNksClient(opts);
5538
+ startSpinner("NKS \uC560\uB4DC\uC628 \uBAA9\uB85D \uC870\uD68C \uC911...");
5539
+ let addons;
5540
+ try {
5541
+ addons = await client.listAddons({
5542
+ k8sVersion: opts.k8sVersion,
5543
+ image: opts.image,
5544
+ platformVersion: opts.platformVersion
5545
+ });
5546
+ } catch (err) {
5547
+ stopSpinner(false);
5548
+ throw err;
5549
+ }
5550
+ stopSpinner(true);
5551
+ output(opts, {
5552
+ headers: ["id", "name", "version", "status"],
5553
+ rows: addons.map(addonRow2),
5554
+ raw: addons,
5555
+ ids: addons.map((addon) => addon.uuid ?? addon.id ?? addon.name)
5556
+ });
5557
+ });
5558
+ var addonGetCommand = new import_commander41.Command("get").description("NKS \uC560\uB4DC\uC628\uC744 \uC870\uD68C\uD55C\uB2E4").argument("<addon>", "\uC560\uB4DC\uC628 UUID \uB610\uB294 \uC774\uB984").option("--region <region>", "region override (\uAE30\uBCF8: iaas \uC790\uACA9\uC99D\uBA85\uC758 region)").option("--profile <name>", "\uC0AC\uC6A9\uD560 profile \uC774\uB984").action(async (addon, _opts, cmd) => {
5559
+ const opts = cmd.optsWithGlobals();
5560
+ const { client } = await resolveNksClient(opts);
5561
+ startSpinner("NKS \uC560\uB4DC\uC628 \uC870\uD68C \uC911...");
5562
+ let result;
5563
+ try {
5564
+ result = await client.getAddon(addon);
5565
+ } catch (err) {
5566
+ stopSpinner(false);
5567
+ throw err;
5568
+ }
5569
+ stopSpinner(true);
5570
+ output(opts, {
5571
+ headers: ["id", "name", "version", "status"],
5572
+ rows: [addonRow2(result)],
5573
+ raw: result,
5574
+ ids: [result.uuid ?? result.id ?? result.name]
5575
+ });
5576
+ });
5577
+ var addonCommand = new import_commander41.Command("addon").description("NKS \uC560\uB4DC\uC628 \uAD00\uB828 \uBA85\uB839").addCommand(addonListCommand).addCommand(addonGetCommand);
5578
+
4208
5579
  // src/index.ts
4209
- var program = new import_commander38.Command();
4210
- program.name("nhncloud").description("NHN Cloud CLI \u2014 AI agent & terminal friendly").version("0.5.0").option("--json", "JSON \uD615\uC2DD\uC73C\uB85C \uCD9C\uB825").option("--quiet", "\uCD5C\uC18C \uCD9C\uB825 (\uC790\uB3D9\uD654\uC6A9)").option("--no-color", "\uC0C9\uC0C1 \uBE44\uD65C\uC131\uD654");
5580
+ var program = new import_commander42.Command();
5581
+ program.name("nhncloud").description("NHN Cloud CLI \u2014 AI agent & terminal friendly").version("0.6.0").option("--json", "JSON \uD615\uC2DD\uC73C\uB85C \uCD9C\uB825").option("--quiet", "\uCD5C\uC18C \uCD9C\uB825 (\uC790\uB3D9\uD654\uC6A9)").option("--no-color", "\uC0C9\uC0C1 \uBE44\uD65C\uC131\uD654");
4211
5582
  program.hook("preAction", () => {
4212
5583
  const opts = program.opts();
4213
5584
  if (!opts.color || process.env["NO_COLOR"]) {
4214
- import_chalk12.default.level = 0;
5585
+ import_chalk14.default.level = 0;
4215
5586
  }
4216
5587
  if (opts.json || opts.quiet) {
4217
5588
  setQuiet(true);
4218
5589
  }
4219
5590
  });
4220
5591
  program.addCommand(configureCommand);
4221
- var logncrashCommand = new import_commander38.Command("logncrash").description("Log & Crash \uAD00\uB828 \uBA85\uB839");
5592
+ var logncrashCommand = new import_commander42.Command("logncrash").description("Log & Crash \uAD00\uB828 \uBA85\uB839");
4222
5593
  logncrashCommand.addCommand(searchCommand);
4223
5594
  logncrashCommand.addCommand(sendCommand);
4224
5595
  logncrashCommand.addCommand(exportCommand);
4225
5596
  program.addCommand(logncrashCommand);
4226
- var deployCommand = new import_commander38.Command("deploy").description("NHN Cloud Deploy \uAD00\uB828 \uBA85\uB839");
5597
+ var deployCommand = new import_commander42.Command("deploy").description("NHN Cloud Deploy \uAD00\uB828 \uBA85\uB839");
4227
5598
  deployCommand.addCommand(runCommand);
4228
5599
  deployCommand.addCommand(artifactsCommand);
4229
5600
  deployCommand.addCommand(serverGroupsCommand);
@@ -4233,7 +5604,7 @@ deployCommand.addCommand(binariesCommand);
4233
5604
  deployCommand.addCommand(uploadCommand);
4234
5605
  deployCommand.addCommand(downloadCommand);
4235
5606
  program.addCommand(deployCommand);
4236
- var instanceCommand = new import_commander38.Command("instance").description("Compute \uC778\uC2A4\uD134\uC2A4 \uAD00\uB828 \uBA85\uB839");
5607
+ var instanceCommand = new import_commander42.Command("instance").description("Compute \uC778\uC2A4\uD134\uC2A4 \uAD00\uB828 \uBA85\uB839");
4237
5608
  instanceCommand.addCommand(listCommand);
4238
5609
  instanceCommand.addCommand(flavorsCommand);
4239
5610
  instanceCommand.addCommand(availabilityZonesCommand);
@@ -4252,31 +5623,38 @@ instanceCommand.addCommand(keypairCommand);
4252
5623
  instanceCommand.addCommand(volumeCommand);
4253
5624
  instanceCommand.addCommand(volumesCommand);
4254
5625
  program.addCommand(instanceCommand);
4255
- var networkCommand = new import_commander38.Command("network").description("VPC\xB7\uC11C\uBE0C\uB137 \uC870\uD68C");
5626
+ var networkCommand = new import_commander42.Command("network").description("VPC\xB7\uC11C\uBE0C\uB137 \uC870\uD68C");
4256
5627
  networkCommand.addCommand(listCommand3);
4257
5628
  networkCommand.addCommand(subnetCommand);
4258
5629
  program.addCommand(networkCommand);
4259
- var volumeCommand2 = new import_commander38.Command("volume").description("Block Storage \uBCFC\uB968 \uAD00\uB828 \uBA85\uB839");
5630
+ var volumeCommand2 = new import_commander42.Command("volume").description("Block Storage \uBCFC\uB968 \uAD00\uB828 \uBA85\uB839");
4260
5631
  volumeCommand2.addCommand(listCommand2);
4261
5632
  volumeCommand2.addCommand(getCommand);
4262
5633
  volumeCommand2.addCommand(createCommand);
4263
5634
  program.addCommand(volumeCommand2);
4264
- var floatingipCommand = new import_commander38.Command("floatingip").description(
5635
+ var floatingipCommand = new import_commander42.Command("floatingip").description(
4265
5636
  "Floating IP(\uC778\uC2A4\uD134\uC2A4 \uACF5\uC778 IP) \uAD00\uB9AC"
4266
5637
  );
4267
5638
  floatingipCommand.addCommand(listCommand4);
4268
5639
  floatingipCommand.addCommand(createCommand2);
4269
5640
  floatingipCommand.addCommand(deleteCommand);
4270
5641
  program.addCommand(floatingipCommand);
4271
- var ncrCommand = new import_commander38.Command("ncr").description("NHN Container Registry \uAD00\uB828 \uBA85\uB839");
5642
+ var ncrCommand = new import_commander42.Command("ncr").description("NHN Container Registry \uAD00\uB828 \uBA85\uB839");
4272
5643
  ncrCommand.addCommand(listCommand5);
4273
5644
  ncrCommand.addCommand(getCommand3);
4274
5645
  ncrCommand.addCommand(imagesCommand2);
4275
5646
  ncrCommand.addCommand(tagsCommand);
4276
5647
  program.addCommand(ncrCommand);
5648
+ var nksCommand = new import_commander42.Command("nks").description("NHN Kubernetes Service \uAD00\uB828 \uBA85\uB839");
5649
+ nksCommand.addCommand(supportsCommand);
5650
+ nksCommand.addCommand(clusterCommand);
5651
+ nksCommand.addCommand(nodegroupCommand);
5652
+ nksCommand.addCommand(addonTypeCommand);
5653
+ nksCommand.addCommand(addonCommand);
5654
+ program.addCommand(nksCommand);
4277
5655
  program.parseAsync().catch((err) => {
4278
5656
  const message = err instanceof Error ? err.message : String(err);
4279
5657
  const exitCode = err instanceof NhnCloudCliError ? err.exitCode : 1;
4280
- process.stderr.write(import_chalk12.default.red(`\uC624\uB958: ${message}`) + "\n");
5658
+ process.stderr.write(import_chalk14.default.red(`\uC624\uB958: ${message}`) + "\n");
4281
5659
  process.exit(exitCode);
4282
5660
  });