From 0f9e037389de11cefd00e51c093ad033b370b102 Mon Sep 17 00:00:00 2001 From: Liviu Frateanu Date: Mon, 20 Oct 2025 18:47:35 +0300 Subject: [PATCH] MsSql provisioner fixes --- ...rovisioning.totalsoft.ro_mssqldatabases.yaml | 3 +++ .../provisioners/pulumi/mssql_db.go | 17 ++++++++--------- .../provisioning/v1alpha1/mssqlDatabaseTypes.go | 3 +++ .../v1alpha1/mssqldatabaserestorespec.go | 15 ++++++++++++--- 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/helm/crds/provisioning.totalsoft.ro_mssqldatabases.yaml b/helm/crds/provisioning.totalsoft.ro_mssqldatabases.yaml index 547a7d7..bc351a6 100644 --- a/helm/crds/provisioning.totalsoft.ro_mssqldatabases.yaml +++ b/helm/crds/provisioning.totalsoft.ro_mssqldatabases.yaml @@ -121,6 +121,9 @@ spec: logicalDataFileName: description: The logical name of the data file in the backup. type: string + logicalFileStreamFileName: + description: The logical name of the file stream file in the backup. + type: string logicalLogFileName: description: The logical name of the log file in the backup. type: string diff --git a/internal/controllers/provisioning/provisioners/pulumi/mssql_db.go b/internal/controllers/provisioning/provisioners/pulumi/mssql_db.go index 4b00fd8..5981c28 100644 --- a/internal/controllers/provisioning/provisioners/pulumi/mssql_db.go +++ b/internal/controllers/provisioning/provisioners/pulumi/mssql_db.go @@ -20,7 +20,8 @@ func deployMsSqlDb(target provisioning.ProvisioningTarget, valueExporter := handleValueExport(target) gvk := provisioningv1.SchemeGroupVersion.WithKind("MsSqlDatabase") - provider, err := mssql.NewProvider(ctx, "provider-mssql", &mssql.ProviderArgs{ + providerName := fmt.Sprintf("provider-mssql-%s", mssqlDb.Name) + provider, err := mssql.NewProvider(ctx, providerName, &mssql.ProviderArgs{ Hostname: pulumi.String(mssqlDb.Spec.SqlServer.HostName), Port: pulumi.Int(mssqlDb.Spec.SqlServer.Port), SqlAuth: &mssql.ProviderSqlAuthArgs{ @@ -66,6 +67,10 @@ func deployMsSqlDb(target provisioning.ProvisioningTarget, DatabaseId: db.ID(), ReadScript: pulumi.String("SELECT CASE WHEN EXISTS (SELECT 1 FROM sys.tables) THEN 'Initialized' ELSE 'Empty' END AS [DatabaseStatus]"), UpdateScript: db.Name.ApplyT(func(n string) pulumi.StringOutput { + xtpMove := "" + if mssqlDb.Spec.RestoreFrom.LogicalFileStreamFileName != "" { + xtpMove = fmt.Sprintf(", MOVE N'%s' TO @XtpFilePath", mssqlDb.Spec.RestoreFrom.LogicalFileStreamFileName) + } return pulumi.Sprintf(` DECLARE @DataFilePath NVARCHAR(512) = CAST(SERVERPROPERTY('InstanceDefaultDataPath') AS NVARCHAR(512)) + '%v.mdf'; DECLARE @LogFilePath NVARCHAR(512) = CAST(SERVERPROPERTY('InstanceDefaultLogPath') AS NVARCHAR(512)) + '%v.ldf'; @@ -75,17 +80,11 @@ IF (SELECT COUNT(1) FROM sys.tables) = 0 BEGIN USE master; ALTER DATABASE [%v] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; - RESTORE DATABASE [%v] FROM DISK = '%v' WITH FILE = 1, MOVE N'%v' TO @DataFilePath, MOVE N'%v' TO @LogFilePath, MOVE N'XTP' TO @XtpFilePath, NOUNLOAD, REPLACE; + RESTORE DATABASE [%v] FROM DISK = '%v' WITH FILE = 1, MOVE N'%v' TO @DataFilePath, MOVE N'%v' TO @LogFilePath%s, NOUNLOAD, REPLACE; ALTER DATABASE [%v] SET MULTI_USER; END - `, n, n, n, n, n, mssqlDb.Spec.RestoreFrom.BackupFilePath, mssqlDb.Spec.RestoreFrom.LogicalDataFileName, mssqlDb.Spec.RestoreFrom.LogicalLogFileName, n) + `, n, n, n, n, n, mssqlDb.Spec.RestoreFrom.BackupFilePath, mssqlDb.Spec.RestoreFrom.LogicalDataFileName, mssqlDb.Spec.RestoreFrom.LogicalLogFileName, xtpMove, n) }).(pulumi.StringOutput), - DeleteScript: db.Name.ApplyT( - func(n string) pulumi.StringOutput { - return pulumi.Sprintf(` -ALTER DATABASE [%v] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; - `, n) - }).(pulumi.StringOutput), State: pulumi.StringMap{ "DatabaseStatus": pulumi.String("Initialized"), }, diff --git a/pkg/apis/provisioning/v1alpha1/mssqlDatabaseTypes.go b/pkg/apis/provisioning/v1alpha1/mssqlDatabaseTypes.go index f21f41c..77a2571 100644 --- a/pkg/apis/provisioning/v1alpha1/mssqlDatabaseTypes.go +++ b/pkg/apis/provisioning/v1alpha1/mssqlDatabaseTypes.go @@ -60,6 +60,9 @@ type MsSqlDatabaseRestoreSpec struct { LogicalDataFileName string `json:"logicalDataFileName,omitempty"` // The logical name of the log file in the backup. LogicalLogFileName string `json:"logicalLogFileName,omitempty"` + // The logical name of the file stream file in the backup. + // +optional + LogicalFileStreamFileName string `json:"logicalFileStreamFileName,omitempty"` } type MsSqlDatabaseExportsSpec struct { diff --git a/pkg/generated/applyconfiguration/provisioning/v1alpha1/mssqldatabaserestorespec.go b/pkg/generated/applyconfiguration/provisioning/v1alpha1/mssqldatabaserestorespec.go index ab80928..4b9b6df 100644 --- a/pkg/generated/applyconfiguration/provisioning/v1alpha1/mssqldatabaserestorespec.go +++ b/pkg/generated/applyconfiguration/provisioning/v1alpha1/mssqldatabaserestorespec.go @@ -21,9 +21,10 @@ package v1alpha1 // MsSqlDatabaseRestoreSpecApplyConfiguration represents an declarative configuration of the MsSqlDatabaseRestoreSpec type for use // with apply. type MsSqlDatabaseRestoreSpecApplyConfiguration struct { - BackupFilePath *string `json:"backupFilePath,omitempty"` - LogicalDataFileName *string `json:"logicalDataFileName,omitempty"` - LogicalLogFileName *string `json:"logicalLogFileName,omitempty"` + BackupFilePath *string `json:"backupFilePath,omitempty"` + LogicalDataFileName *string `json:"logicalDataFileName,omitempty"` + LogicalLogFileName *string `json:"logicalLogFileName,omitempty"` + LogicalFileStreamFileName *string `json:"logicalFileStreamFileName,omitempty"` } // MsSqlDatabaseRestoreSpecApplyConfiguration constructs an declarative configuration of the MsSqlDatabaseRestoreSpec type for use with @@ -55,3 +56,11 @@ func (b *MsSqlDatabaseRestoreSpecApplyConfiguration) WithLogicalLogFileName(valu b.LogicalLogFileName = &value return b } + +// WithLogicalFileStreamFileName sets the LogicalFileStreamFileName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LogicalFileStreamFileName field is set to the value of the last call. +func (b *MsSqlDatabaseRestoreSpecApplyConfiguration) WithLogicalFileStreamFileName(value string) *MsSqlDatabaseRestoreSpecApplyConfiguration { + b.LogicalFileStreamFileName = &value + return b +}