mirror of
				https://github.com/1Password/onepassword-operator.git
				synced 2025-10-31 11:49:40 +00:00 
			
		
		
		
	 cabc020cc6
			
		
	
	cabc020cc6
	
	
	
		
			
			* Add missing improvements from Operator SDK 1.34.1 These were not mentioned in the upgrade documentation for version 1.34.x (https://sdk.operatorframework.io/docs/upgrading-sdk-version/v1.34.0/), but I've found them by compating the release with the previous one (https://github.com/operator-framework/operator-sdk/compare/v1.33.0...v1.34.1). * Upgrade to Operator SDK 1.36.0 Source of upgrade steps: https://sdk.operatorframework.io/docs/upgrading-sdk-version/v1.36.0/ Key differences: - Go packages `k8s.io/*` are already at a version higher than the one in the upgrade. - `ENVTEST_K8S_VERSION` is at a version higher than the one in the upgrade - We didn't have the golangci-lint make command before, thus we only needed to add things. * Upgrade to Operator SDK 1.38.0 Source of upgrade steps: https://sdk.operatorframework.io/docs/upgrading-sdk-version/v1.38.0/ * Upgrade to Operator SDK 1.39.0 Source of upgrade steps: https://sdk.operatorframework.io/docs/upgrading-sdk-version/v1.39.0/ * Upgrade to Operator SDK 1.40.0 Source of upgrade steps: https://sdk.operatorframework.io/docs/upgrading-sdk-version/v1.40.0/ I didn't do the "Add app.kubernetes.io/name label to your manifests" since it seems that we have it already, and it's customized. * Address lint errors * Update golangci-lint version used to support Go 1.24 * Improve workflows - Make workflow targets more specific. - Make build workflow only build (i.e. remove test part of it). - Rearrange steps and improve naming for build workflow. * Add back deleted test Initially the test has been removed due to lint saying that it was duplicate code, but it falsely errored since the values are different. * Improve code and add missing upgrade pieces * Upgrade to Operator SDK 1.41.1 Source of upgrade steps: https://sdk.operatorframework.io/docs/upgrading-sdk-version/v1.41.0/ Upgrading to 1.41.1 from 1.40.0 doesn't have any migration steps. Key elements: - Upgrade to golangci-lint v2 - Made the manifests using the updated controller tools * Address linter errors golanci-lint v2 seems to be more robust than the previous one, which is beneficial. Thus, we address the linter errors thrown by v2 and improve our code even further. * Add Makefile improvements These were brought in by comparing the Makefile of a freshly created operator using the latest operator-sdk with ours. * Add missing default kustomization for 1.40.0 upgrade * Bring default kustomization to latest version This is done by putting the file's content from a newly-generated operator. * Switch metrics-bind-address default value back to 8080 This ensures that the upgrade is backwards-compatible. * Add webhook-related scaffolding This enables us to easily add support for webhooks by running `operator-sdk create webhook` whenever we want to add them. * Fix typo
		
			
				
	
	
		
			111 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package onepassword
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"fmt"
 | |
| 	"strings"
 | |
| 
 | |
| 	logf "sigs.k8s.io/controller-runtime/pkg/log"
 | |
| 
 | |
| 	opclient "github.com/1Password/onepassword-operator/pkg/onepassword/client"
 | |
| 	"github.com/1Password/onepassword-operator/pkg/onepassword/model"
 | |
| )
 | |
| 
 | |
| var logger = logf.Log.WithName("retrieve_item")
 | |
| 
 | |
| func GetOnePasswordItemByPath(ctx context.Context, opClient opclient.Client, path string) (*model.Item, error) {
 | |
| 	vaultNameOrID, itemNameOrID, err := ParseVaultAndItemFromPath(path)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	vaultID, err := getVaultID(ctx, opClient, vaultNameOrID)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to 'getVaultID' for vaultNameOrID='%s': %w", vaultNameOrID, err)
 | |
| 	}
 | |
| 
 | |
| 	itemID, err := getItemID(ctx, opClient, vaultID, itemNameOrID)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("faild to 'getItemID' for vaultID='%s' and itemNameOrID='%s': %w", vaultID, itemNameOrID, err)
 | |
| 	}
 | |
| 
 | |
| 	item, err := opClient.GetItemByID(ctx, vaultID, itemID)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("faield to 'GetItemByID' for vaultID='%s' and itemID='%s': %w", vaultID, itemID, err)
 | |
| 	}
 | |
| 
 | |
| 	for i, file := range item.Files {
 | |
| 		content, err := opClient.GetFileContent(ctx, vaultID, itemID, file.ID)
 | |
| 		if err != nil {
 | |
| 			return nil, err
 | |
| 		}
 | |
| 		item.Files[i].SetContent(content)
 | |
| 	}
 | |
| 
 | |
| 	return item, nil
 | |
| }
 | |
| 
 | |
| func ParseVaultAndItemFromPath(path string) (string, string, error) {
 | |
| 	splitPath := strings.Split(path, "/")
 | |
| 	if len(splitPath) == 4 && splitPath[0] == "vaults" && splitPath[2] == "items" {
 | |
| 		return splitPath[1], splitPath[3], nil
 | |
| 	}
 | |
| 	return "", "", fmt.Errorf(
 | |
| 		"%q is not an acceptable path for One Password item. Must be of the format: `vaults/{vault_id}/items/{item_id}`",
 | |
| 		path,
 | |
| 	)
 | |
| }
 | |
| 
 | |
| func getVaultID(ctx context.Context, client opclient.Client, vaultNameOrID string) (string, error) {
 | |
| 	if !IsValidClientUUID(vaultNameOrID) {
 | |
| 		vaults, err := client.GetVaultsByTitle(ctx, vaultNameOrID)
 | |
| 		if err != nil {
 | |
| 			return "", err
 | |
| 		}
 | |
| 
 | |
| 		if len(vaults) == 0 {
 | |
| 			return "", fmt.Errorf("no vaults found with identifier %q", vaultNameOrID)
 | |
| 		}
 | |
| 
 | |
| 		oldestVault := vaults[0]
 | |
| 		if len(vaults) > 1 {
 | |
| 			for _, returnedVault := range vaults {
 | |
| 				if returnedVault.CreatedAt.Before(oldestVault.CreatedAt) {
 | |
| 					oldestVault = returnedVault
 | |
| 				}
 | |
| 			}
 | |
| 			logger.Info(fmt.Sprintf("%v 1Password vaults found with the title %q. Will use vault %q as it is the oldest.",
 | |
| 				len(vaults), vaultNameOrID, oldestVault.ID,
 | |
| 			))
 | |
| 		}
 | |
| 		vaultNameOrID = oldestVault.ID
 | |
| 	}
 | |
| 	return vaultNameOrID, nil
 | |
| }
 | |
| 
 | |
| func getItemID(ctx context.Context, client opclient.Client, vaultId, itemNameOrID string) (string, error) {
 | |
| 	if !IsValidClientUUID(itemNameOrID) {
 | |
| 		items, err := client.GetItemsByTitle(ctx, vaultId, itemNameOrID)
 | |
| 		if err != nil {
 | |
| 			return "", err
 | |
| 		}
 | |
| 
 | |
| 		if len(items) == 0 {
 | |
| 			return "", fmt.Errorf("no items found with identifier %q", itemNameOrID)
 | |
| 		}
 | |
| 
 | |
| 		oldestItem := items[0]
 | |
| 		if len(items) > 1 {
 | |
| 			for _, returnedItem := range items {
 | |
| 				if returnedItem.CreatedAt.Before(oldestItem.CreatedAt) {
 | |
| 					oldestItem = returnedItem
 | |
| 				}
 | |
| 			}
 | |
| 			logger.Info(fmt.Sprintf("%v 1Password items found with the title %q. Will use item %q as it is the oldest.",
 | |
| 				len(items), itemNameOrID, oldestItem.ID,
 | |
| 			))
 | |
| 		}
 | |
| 		itemNameOrID = oldestItem.ID
 | |
| 	}
 | |
| 	return itemNameOrID, nil
 | |
| }
 |