adobe / adobe/aio-cli-plugin-runtime

rt package delete --recursive fails for packages with feed-backed triggers (wrong field name in recursivelyDeletePackage)

オープン 初心者向け
#431 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る
主要言語
JavaScript
スター
21
フォーク
33
PR マージ指標
30日以内にマージされた PR はありません

説明

## Bug report

`aio rt package delete --recursive` fails to delete a package when one of its actions is bound (via a rule) to a **feed-backed trigger** (e.g. `/whisk.system/alarms/interval`, `/whisk.system/alarms/alarm`).

### Observed error

```
Error: failed to delete the package: Missing mandatory trigger parameter from options.
```

### Root cause

In [`src/commands/runtime/package/delete.js`](https://github.com/adobe/aio-cli-plugin-runtime/blob/master/src/commands/runtime/package/delete.js), `recursivelyDeletePackage()` builds the trigger reference for each rule with the wrong field name:

```js
const ruleData = {
ruleName: rule.name,
trigger: {
namespace: rule.trigger.path,
triggerName: rule.trigger.name // <-- should be `name`, not `triggerName`
}
}
...
deleteEntitiesPromises.push(ow.triggers.delete(actionRule.trigger), ow.rules.delete(actionRule.ruleName))
```

This object is passed straight into `ow.triggers.delete(...)`, which resolves to `@adobe/aio-lib-runtime`'s wrapped `Triggers.delete()` (src/triggers.js):

```js
async delete (options) {
const retTrigger = await this.owclient.triggers.get(options) // succeeds: raw openwhisk client accepts `triggerName` as a fallback identifier
if (retTrigger.annotations) {
for (const annotation of retTrigger.annotations) {
if (annotation.key === 'feed') {
await this.owclient.feeds.delete({ name: annotation.value, trigger: options.name }) // <-- reads options.name specifically
}
}
}
return this.owclient.triggers.delete(options)
}
```

Since the passed-in object only has `triggerName` (not `name`), `options.name` is `undefined`. This is then passed to `openwhisk-client-js`'s `Feeds.feed()`, which validates the `trigger` param and throws:

```js
if (!this.triggerName(options)) {
throw new Error(messages.MISSING_FEED_TRIGGER_ERROR) // 'Missing mandatory trigger parameter from options.'
}
```

### Impact

Because `Promise.all(deleteEntitiesPromises)` rejects as soon as any one deletion throws, the trailing `ow.packages.delete(pkg)` call in `recursivelyDeletePackage` never executes. This means:

1. The package itself is never deleted when this happens (not just the feed deregistration).
2. The feed (e.g. the alarms provider registration backing an interval/alarm trigger) is never properly deregistered via this path, since the `feeds.delete()` call throws before reaching the underlying HTTP call.

### Repro steps

1. Deploy a manifest with an action, a feed-backed trigger, and a rule connecting them, e.g.:
```yaml
triggers:
every-5-min:
feed: /whisk.system/alarms/interval
inputs:
minutes: 5
rules:
fire-every-5-min:
trigger: every-5-min
action: someAction
```
2. `aio app deploy` (or `aio rt trigger create` + `aio rt rule create` directly).
3. `aio rt package delete --recursive`
4. Observe: `Error: failed to delete the package: Missing mandatory trigger parameter from options.`

### Suggested fix

In `recursivelyDeletePackage`, use `name` instead of `triggerName` when building the trigger reference:

```js
trigger: {
namespace: rule.trigger.path,
name: rule.trigger.name
}
```

### Environment

- `aio-cli-plugin-app`: 14.8.1 (observed via `aio info`)
- `aio-cli`: 11.1.2
- Node: 24.6.0

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

src/commands/runtime/package/delete.js の recursivelyDeletePackage() から始め、続いて trigger の削除呼び出しと src/triggers.js にある Triggers.delete() の動作を追跡します。feed に依存する trigger とパッケージの再帰的な削除で再現します。パッケージ、ルール、trigger、feed が missing-trigger-parameter エラーなしで削除されれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
javascript
領域
cli
issue の種類
バグ
難易度
2/5
見積もり時間
1〜3時間
活発さ
静か
明瞭さ
明確に書かれている
初心者へのやさしさ
76/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。