使用 go azure sdk 处理禁用的 azure key vault 秘密?

Handling a disabled azure key vault secret using go azure sdk?

我正在尝试使用 Go 编写的扩展 Kubernetes 运算符来处理已禁用的 Azure Key Vault Secrets。操作员正在使用 Azure SDK for Go 以及 Azure autorest 库。

我是 Go 的新手,当出现错误时我很难填充 ServiceError 结构

我正在查看的代码片段是这样的:(参见 context

    response, err := sm.client.GetSecret(ctx, fmt.Sprintf(azureVaultURLFmt, sm.azureVaultName), secretID, "")
    if err != nil {
        if e, ok := err.(autorest.DetailedError); ok && e.StatusCode.(int) == 404 {
            return []byte{}, nil
        }
        return []byte{}, err
    }

目前它处理 404 http 状态代码指出的丢失的秘密。但是,当您读取一个显示为 403 的已禁用秘密并且在 ServiceError 中有额外的错误信息时,我想处理错误情况。但是,无论我尝试什么,我都无法弄清楚如何获得 ServiceError 结构。

我试过:

        if e, ok := err.(azure.ServiceError); ok {
            log.V(0).Info("Go an azure service error")
            return []byte{}, nil
        }

但代码从未被调用。

使用原始代码,我将 delve 调试器附加到 vscode,我可以看到 e 变量有一个额外的隐藏 data 变量,它似乎同时包含ServiceErrorDetailedError 结构,但我无法访问 ServiceError.

DetailedError 结构上有一个 ServiceError 字节数组。我应该手动调用 UnmarshallJSON 或类似的东西吗?我认为它应该以某种方式神奇地为我做到这一点,但我只是不确定如何。

我错过了什么?

所以我设法通过使用调试器并检查 err 对象找到了解决方法。它不是特别漂亮,但确实有效。

    response, err := sm.client.GetSecret(ctx, fmt.Sprintf(azureVaultURLFmt, sm.azureVaultName), secretID, "")
    if err != nil {
        // We can ignore some errors
        if de, ok := err.(autorest.DetailedError); ok {
            if re, ok := de.Original.(*azure.RequestError); ok {
                if re.ServiceError.Code == "SecretNotFound" {
                    // Secret not existing is fine, as that means we will create a new secret
                    return []byte{}, nil
                } else if code, ok := re.ServiceError.InnerError["code"].(string); ok && code == "SecretDisabled" {
                    // Disabled secret also fine, as it means we will create a new version of the secret
                    return []byte{}, nil
                }
            }
        }
        return []byte{}, err
    }