diff --git a/internal/app/azure/main.go b/internal/app/azure/main.go new file mode 100644 index 0000000..e45bb62 --- /dev/null +++ b/internal/app/azure/main.go @@ -0,0 +1,68 @@ +package azure + +import ( + "context" + "errors" + "fmt" + "net/url" + + "git.ksdemosapps.com/kylesoda/go-migrate/internal/app/config" + "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" +) + +var ( + ErrInvalidConnectionString = errors.New("invalid connection string") + ErrContainerNotFound = errors.New("container not found") + ErrBlobNotFound = errors.New("blob not found") + ErrInvalidInput = errors.New("invalid input parameters") +) + +type Client struct { + client *azblob.Client + azureStorageConfig config.AzureStorageConfig +} + +func NewClient(azureStorageConfig config.AzureStorageConfig) (*Client, error) { + protocol := "https" + if !azureStorageConfig.UseHTTPS { + protocol = "http" + } + + blobEndpoint, _ := url.JoinPath(azureStorageConfig.ServiceURL, azureStorageConfig.AccountName) + connStr := fmt.Sprintf("DefaultEndpointsProtocol=%s;AccountName=%s;AccountKey=%s;BlobEndpoint=%s;", + protocol, azureStorageConfig.AccountName, azureStorageConfig.AccountKey, blobEndpoint) + + client, err := azblob.NewClientFromConnectionString(connStr, nil) + if err != nil { + return nil, fmt.Errorf("creating azure storage client: %w", err) + } + + return &Client{ + client: client, + azureStorageConfig: azureStorageConfig, + }, nil +} + +func (c *Client) CreateContainer(ctx context.Context, containerName string) error { + if containerName == "" { + return ErrInvalidInput + } + + _, err := c.client.CreateContainer(ctx, containerName, nil) + if err != nil { + return fmt.Errorf("creating container %s: %w", containerName, err) + } + return nil +} + +func (c *Client) UploadBuffer(ctx context.Context, containerName, blobPath string, buffer []byte) error { + if containerName == "" || blobPath == "" || buffer == nil { + return ErrInvalidInput + } + + _, err := c.client.UploadBuffer(ctx, containerName, blobPath, buffer, nil) + if err != nil { + return fmt.Errorf("uploading blob %s: %w", blobPath, err) + } + return nil +} diff --git a/internal/app/config/main.go b/internal/app/config/main.go index 55f0b32..1ff1473 100644 --- a/internal/app/config/main.go +++ b/internal/app/config/main.go @@ -6,7 +6,7 @@ import ( log "github.com/sirupsen/logrus" ) -type AzureConfig struct { +type AzureStorageConfig struct { AccountName string `env:"AZ_ACCOUNT_NAME"` Container string `env:"AZ_CONTAINER"` AccountKey string `env:"AZ_ACCOUNT_KEY"` @@ -17,10 +17,10 @@ type AzureConfig struct { } type appConfig struct { - SourceDbUrl string `env:"SOURCE_DB_URL,required"` - TargetDbUrl string `env:"TARGET_DB_URL,required"` - LogLevel string `env:"LOG_LEVEL" envDefault:"INFO"` - Azure AzureConfig + SourceDbUrl string `env:"SOURCE_DB_URL,required"` + TargetDbUrl string `env:"TARGET_DB_URL,required"` + LogLevel string `env:"LOG_LEVEL" envDefault:"INFO"` + AzureStorage AzureStorageConfig } func getAppConfig() appConfig { diff --git a/scripts/az-blob/main.go b/scripts/az-blob/main.go index 9453cd3..3a4173f 100644 --- a/scripts/az-blob/main.go +++ b/scripts/az-blob/main.go @@ -7,16 +7,15 @@ import ( "math/rand" "sync" - "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" + "git.ksdemosapps.com/kylesoda/go-migrate/internal/app/azure" + "git.ksdemosapps.com/kylesoda/go-migrate/internal/app/config" ) func main() { - accountKey := "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==" - connStr := fmt.Sprintf("DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=%s;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;", accountKey) - containerName := "pruebas" + cfg := config.App.AzureStorage + containerName := cfg.Container - // 1. Crear cliente - client, err := azblob.NewClientFromConnectionString(connStr, nil) + client, err := azure.NewClient(cfg) if err != nil { log.Fatalf("Error creando cliente: %v", err) } @@ -24,17 +23,15 @@ func main() { var wg sync.WaitGroup - // 3. Subir archivos for i := 1; i <= 10; i++ { wg.Add(1) go func(id int) { defer wg.Done() - blobName := fmt.Sprintf("archivo-%d.txt", id) + blobName := fmt.Sprintf("%sarchivo-%d.txt", cfg.Prefix, id) content := fmt.Sprintf("Contenido aleatorio: %d", rand.Intn(100000)) - // Usamos UploadBuffer - _, err := client.UploadBuffer(ctx, containerName, blobName, []byte(content), nil) + err := client.UploadBuffer(ctx, containerName, blobName, []byte(content)) if err != nil { log.Printf("Fallo al subir %s: %v", blobName, err) } else {