Skip to content

Commit

Permalink
Merge pull request #169 from Devolutions/sogar_update
Browse files Browse the repository at this point in the history
Don't use sogar_cli to push files to remote registry
  • Loading branch information
fdubois1 authored Jul 15, 2021
2 parents 80d20e8 + e1fc4f6 commit eb84a89
Show file tree
Hide file tree
Showing 7 changed files with 40 additions and 99 deletions.
4 changes: 2 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion devolutions-gateway/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ spsc-bip-buffer = { git = "https://github.com/Devolutions/spsc-bip-buffer.git",
indexmap = "1.0"
dlopen = "0.1.8"
dlopen_derive = "0.1.4"
sogar-core = "0.1"
sogar-core = "0.2"
tempfile = "3.0"
rust-argon2 = "0.8"

Expand Down
33 changes: 0 additions & 33 deletions devolutions-gateway/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ const ARG_LOG_FILE: &str = "log-file";
const ARG_SERVICE_MODE: &str = "service";
const ARG_PLUGINS: &str = "plugins";
const ARG_RECORDING_PATH: &str = "recording-path";
const ARG_SOGAR_UTIL_PATH: &str = "sogar-path";
const ARG_SOGAR_REGISTRY_URL: &str = "sogar-registry-url";
const ARG_SOGAR_USERNAME: &str = "sogar-username";
const ARG_SOGAR_PASSWORD: &str = "sogar-password";
Expand Down Expand Up @@ -82,7 +81,6 @@ pub struct CertificateConfig {

#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct SogarPushRegistryInfo {
pub sogar_util_path: Option<PathBuf>,
pub registry_url: Option<String>,
pub username: Option<String>,
pub password: Option<String>,
Expand Down Expand Up @@ -177,7 +175,6 @@ impl Default for Config {
keep_time: None,
push_files: None,
sogar_push_registry_info: SogarPushRegistryInfo {
sogar_util_path: None,
registry_url: None,
username: None,
password: None,
Expand Down Expand Up @@ -259,8 +256,6 @@ pub struct ConfigFile {
pub plugins: Option<Vec<String>>,
#[serde(rename = "RecordingPath")]
pub recording_path: Option<String>,
#[serde(rename = "SogarPath")]
pub sogar_util_path: Option<String>,
#[serde(rename = "SogarRegistryUrl")]
pub registry_url: Option<String>,
#[serde(rename = "SogarUsername")]
Expand Down Expand Up @@ -602,27 +597,6 @@ impl Config {
}
}),
)
.arg(
Arg::with_name(ARG_SOGAR_UTIL_PATH)
.long(ARG_SOGAR_UTIL_PATH)
.value_name("PATH")
.help("A path where the sogar utility is located including the name and extension.")
.takes_value(true)
.empty_values(false)
.requires_all(&[
ARG_SOGAR_REGISTRY_URL,
ARG_SOGAR_USERNAME,
ARG_SOGAR_PASSWORD,
ARG_SOGAR_IMAGE_NAME,
])
.validator(|sogar_path| {
if PathBuf::from(sogar_path).is_file() {
Ok(())
} else {
Err(String::from("The value does not exist or is not a file."))
}
}),
)
.arg(
Arg::with_name(ARG_SOGAR_REGISTRY_URL)
.long(ARG_SOGAR_REGISTRY_URL)
Expand Down Expand Up @@ -791,10 +765,6 @@ impl Config {
}
}

if let Some(sogar_path) = matches.value_of(ARG_SOGAR_UTIL_PATH) {
config.sogar_registry_config.sogar_push_registry_info.sogar_util_path = Some(PathBuf::from(sogar_path));
}

if let Some(registry_url) = matches.value_of(ARG_SOGAR_REGISTRY_URL) {
config.sogar_registry_config.sogar_push_registry_info.registry_url = Some(registry_url.to_owned());
}
Expand Down Expand Up @@ -979,8 +949,6 @@ impl Config {
let plugins = config_file.plugins;
let recording_path = config_file.recording_path.map(PathBuf::from);

let sogar_util_path = config_file.sogar_util_path.map(PathBuf::from);

let registry_url = config_file.registry_url;
let username = config_file.username;
let password = config_file.password;
Expand Down Expand Up @@ -1024,7 +992,6 @@ impl Config {
keep_time,
push_files,
sogar_push_registry_info: SogarPushRegistryInfo {
sogar_util_path,
registry_url,
username,
password,
Expand Down
4 changes: 3 additions & 1 deletion devolutions-gateway/src/jet_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,9 @@ async fn handle_build_proxy(

if let (Some(dir), Some(pattern)) = (recording_dir, file_pattern) {
let registry = Registry::new(config);
registry.manage_files(association_id.to_string(), pattern, dir.as_path());
registry
.manage_files(association_id.to_string(), pattern, dir.as_path())
.await;
};

proxy_result
Expand Down
21 changes: 10 additions & 11 deletions devolutions-gateway/src/registry/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ impl Registry {
}
}

pub fn manage_files(&self, tag: String, file_pattern: String, recording_dir: &Path) {
pub async fn manage_files(&self, tag: String, file_pattern: String, recording_dir: &Path) {
let config = self.config.sogar_registry_config.clone();

let files = get_file_list_from_path(file_pattern.as_str(), recording_dir);
Expand All @@ -48,7 +48,7 @@ impl Registry {
}

if let Some(true) = config.push_files {
self.push_files(file_pattern, recording_dir, tag);
self.push_files(file_pattern, recording_dir, tag).await;
}

if let Some(true) = config.keep_files {
Expand All @@ -66,7 +66,7 @@ impl Registry {
fn move_file_to_registry(&self, files: Vec<String>, tag: &str) {
let mut layers = Vec::new();
for file in files {
if let Some(file_data) = move_blob(file, self.registry_path.as_path()) {
if let Some(file_data) = move_blob(&file, self.registry_path.as_path()) {
layers.push(file_data.layer.clone());
}
}
Expand All @@ -87,14 +87,13 @@ impl Registry {

let manifest_mime = create_and_move_manifest(self.registry_path.as_path(), config_data.unwrap(), layers, tag);

registry::add_artifacts_info(tag.to_string(), manifest_mime, self.registry_path.as_path());
registry::add_artifacts_info(tag, manifest_mime, self.registry_path.as_path());
}

fn push_files(&self, file_pattern: String, recording_dir: &Path, tag: String) {
async fn push_files(&self, file_pattern: String, recording_dir: &Path, tag: String) {
let sogar_push_data = self.config.sogar_registry_config.sogar_push_registry_info.clone();

let remote_data = SogarData::new(
sogar_push_data.sogar_util_path.clone(),
sogar_push_data.registry_url,
sogar_push_data.username.clone(),
sogar_push_data.password.clone(),
Expand All @@ -103,7 +102,7 @@ impl Registry {
);

if let Some(push_data) = remote_data {
push_data.push(recording_dir, tag)
push_data.push(recording_dir, tag).await
};
}
}
Expand Down Expand Up @@ -153,9 +152,9 @@ fn create_and_move_manifest(
Some(manifest_file_info.layer.media_type)
}

fn move_blob(file: String, registry_path: &Path) -> Option<FileInfo> {
let file_path = Path::new(file.as_str());
let mime_type = sogar_core::config::get_mime_type_from_file_extension(file.clone());
fn move_blob(file: &str, registry_path: &Path) -> Option<FileInfo> {
let file_path = Path::new(file);
let mime_type = sogar_core::config::get_mime_type_from_file_extension(file);
let annotations = create_annotation_for_filename(file_path);
let file_data = read_file_data(file_path, mime_type, Some(annotations));

Expand All @@ -168,7 +167,7 @@ fn move_blob(file: String, registry_path: &Path) -> Option<FileInfo> {
}

let file_data = file_data.unwrap();
let digest = parse_digest(file_data.layer.digest.clone());
let digest = parse_digest(&file_data.layer.digest);
if digest.is_none() {
error!("Failed to parse digest for the file {}", file);
return None;
Expand Down
71 changes: 21 additions & 50 deletions devolutions-gateway/src/registry/push_files.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
use slog_scope::{debug, error};
use sogar_core::config::{get_mime_type_from_file_extension, CommandData, CommandType, Settings};
use sogar_core::export_sogar_file_artifact;
use std::fs;
use std::path::{Path, PathBuf};
use std::process::Command;
use std::path::Path;

pub struct SogarData {
sogar_path: PathBuf,
registry_url: String,
username: String,
password: String,
Expand All @@ -14,25 +14,17 @@ pub struct SogarData {

impl SogarData {
pub fn new(
sogar_path: Option<PathBuf>,
registry_url: Option<String>,
username: Option<String>,
password: Option<String>,
image_name: Option<String>,
file_pattern: Option<String>,
) -> Option<Self> {
if let (
Some(sogar_path),
Some(registry_url),
Some(username),
Some(password),
Some(image_name),
Some(file_pattern),
) = (sogar_path, registry_url, username, password, image_name, file_pattern)
if let (Some(registry_url), Some(username), Some(password), Some(image_name), Some(file_pattern)) =
(registry_url, username, password, image_name, file_pattern)
{
debug!("Sogar data created!");
Some(SogarData {
sogar_path,
registry_url,
username,
password,
Expand All @@ -44,7 +36,7 @@ impl SogarData {
}
}

pub fn push(&self, path: &Path, tag: String) {
pub async fn push(&self, path: &Path, tag: String) {
let file_paths = get_file_list_from_path(self.file_pattern.as_str(), path);
if file_paths.is_empty() {
debug!(
Expand All @@ -54,44 +46,23 @@ impl SogarData {
return;
}

let reference = format!("{}:{}", self.image_name, tag);
let joined_path: &str = &file_paths.join(";");
self.invoke_command(joined_path, reference);
}

fn invoke_command(&self, file_path: &str, reference: String) {
if self.sogar_path.to_str().is_none() || !self.sogar_path.is_file() {
error!(
"Failed to retrieve path string or path is not a file: {}",
self.sogar_path.display()
);
return;
}

let mut command = Command::new(self.sogar_path.to_str().unwrap());
let args = command
.arg("--registry-url")
.arg(self.registry_url.clone().as_str())
.arg("--username")
.arg(self.username.clone().as_str())
.arg("--password")
.arg(self.password.clone().as_str())
.arg("--export-artifact")
.arg("--reference")
.arg(reference)
.arg("--filepath")
.arg(file_path.to_string());
let command_data = CommandData {
media_type: get_mime_type_from_file_extension(&file_paths[0]),
reference: format!("{}:{}", self.image_name, tag),
filepath: file_paths,
};

debug!("Command args for sogar are: {:?}", args);
let sogar_setting = Settings {
registry_url: self.registry_url.clone(),
username: self.username.clone(),
password: self.password.clone(),
command_type: CommandType::Export,
command_data,
registry_cache: None,
};

match args.output() {
Ok(output) => {
if !output.status.success() {
error!("Status of the output is fail!");
}
debug!("Sogar output: {:?}", output);
}
Err(e) => error!("Command failed with error: {}", e),
if let Err(e) = export_sogar_file_artifact(&sogar_setting).await {
error!("Export sogar file artifact failed: {}", e);
}
}
}
Expand Down
4 changes: 3 additions & 1 deletion devolutions-gateway/src/websocket_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,9 @@ async fn handle_jet_connect_impl(
if has_interceptor {
if let (Some(dir), Some(pattern)) = (recording_dir, file_pattern) {
let registry = crate::registry::Registry::new(config);
registry.manage_files(association_id.clone().to_string(), pattern, dir.as_path());
registry
.manage_files(association_id.clone().to_string(), pattern, dir.as_path())
.await;
};
}

Expand Down

0 comments on commit eb84a89

Please sign in to comment.