protected override async Task ProcessRecordAsync() { if (Container != null) { Id = Container.ID; } if (ToContainer.ToBool()) { var hostPaths = Path.SelectMany(path => { ProviderInfo provider; var resolvedPaths = SessionState.Path.GetResolvedProviderPathFromPSPath(path, out provider); if (provider.Name != "FileSystem") { throw new Exception(string.Format("The path {0} is not in the file system.", path)); } return(resolvedPaths); }).ToList(); var p = new ContainerPathStatParameters { Path = Destination ?? "." }; var progress = new Progress <string>(); progress.ProgressChanged += (o, s) => WriteVerbose(string.Format("Sending {0}", s)); using (var reader = Archiver.CreateTarStream(hostPaths, CmdletCancellationToken, progress)) { await DkrClient.Containers.ExtractArchiveToContainerAsync(Id, p, reader, CmdletCancellationToken); } } else { var hostPath = System.IO.Path.Combine(SessionState.Path.CurrentFileSystemLocation.Path, Destination ?? ""); foreach (var singlePath in Path) { var p = new GetArchiveFromContainerParameters { Path = singlePath }; var response = await DkrClient.Containers.GetArchiveFromContainerAsync(Id, p, false, CmdletCancellationToken); using (var stream = response.Stream) { var progress = new Progress <string>(); progress.ProgressChanged += (o, s) => WriteVerbose(string.Format("Extracting {0}", s)); var tarReader = new TarReader(stream); await tarReader.ExtractDirectoryAsync(hostPath, CmdletCancellationToken, progress); } } } }
public Task ExtractArchiveToContainerAsync(string id, ContainerPathStatParameters parameters, Stream stream, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(id)) { throw new ArgumentNullException(nameof(id)); } if (parameters == null) { throw new ArgumentNullException(nameof(parameters)); } IQueryString queryParameters = new QueryString <ContainerPathStatParameters>(parameters); var data = new BinaryRequestContent(stream, "application/x-tar"); return(this._client.MakeRequestAsync(new[] { NoSuchContainerHandler }, HttpMethod.Put, $"containers/{id}/archive", queryParameters, data, null, cancellationToken)); }
public async Task Restore(string bakFilePath, string dbName) { string targetPath = "/var/tmp"; // the only possibility to copy something into the container is the method ExtractArchiveToContainer // so we have to provide the backup as tar/gzipped stream using (var stream = CreateTarGz(bakFilePath)) { var parameters = new ContainerPathStatParameters { Path = targetPath, AllowOverwriteDirWithFile = true }; await Client.Containers.ExtractArchiveToContainerAsync(ContainerId, parameters, stream); } using (IDbConnection connection = CreateConnection()) { connection.Open(); using (var restoreCommand = connection.CreateCommand()) { restoreCommand.CommandText = "USE master"; restoreCommand.ExecuteNonQuery(); } string logicalDataName = ""; string logicalLogName = ""; using (var fileListCommand = connection.CreateCommand()) { fileListCommand.CommandText = $"RESTORE FILELISTONLY FROM DISK = N'{targetPath}/{Path.GetFileName(bakFilePath)}'"; using (var reader = fileListCommand.ExecuteReader()) { while (reader.Read()) { int typeOrdinal = reader.GetOrdinal("Type"); int logicalNameOrdinal = reader.GetOrdinal("LogicalName"); if (reader.GetString(typeOrdinal) == "D") { logicalDataName = reader.GetString(logicalNameOrdinal); } if (reader.GetString(typeOrdinal) == "L") { logicalLogName = reader.GetString(logicalNameOrdinal); } } } } using (var restoreCommand = connection.CreateCommand()) { var restoreCommandCommandText = $"RESTORE DATABASE [{dbName}] FROM DISK = N'{targetPath}/{Path.GetFileName(bakFilePath)}' " + "WITH FILE = 1, " + $"MOVE N'{logicalDataName}' TO N'/var/opt/mssql/data/{dbName}_data.mdf', " + $"MOVE N'{logicalLogName}' TO N'/var/opt/mssql/data/{dbName}_log.ldf', " + "NOUNLOAD, REPLACE "; restoreCommand.CommandText = restoreCommandCommandText; restoreCommand.ExecuteNonQuery(); } } }