Skip to content

Commit

Permalink
feat: version checks between cli, gateway, deployer, runtime (#1275)
Browse files Browse the repository at this point in the history
* feat(cargo-shuttle): check version against gateway

* print warning at end of output

* support multiple warnings, add deployer version check

* clippy

* check and warn about the runtime version in deployment

* feedback, add cargo-shuttle isolated version endpoint
  • Loading branch information
jonaro00 authored Sep 27, 2023
1 parent e78f6c7 commit 538473a
Show file tree
Hide file tree
Showing 10 changed files with 338 additions and 156 deletions.
4 changes: 3 additions & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
**/target/
**/*Containerfile*
examples/
/examples
**/.cargo/
**/docker/
**/*.md
!**/README.md
Makefile
/assets
/e2e
15 changes: 8 additions & 7 deletions Cargo.lock

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

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ rand = "0.8.5"
reqwest = { version = "0.11.13", default-features = false, features = ["rustls-tls"] }
ring = "0.16.20"
rmp-serde = "1.1.1"
semver = { version = "1.0.19", features = ["serde"] }
serde = { version = "1.0.148", default-features = false }
serde_json = "1.0.89"
sqlx = "0.7.1"
Expand Down
2 changes: 1 addition & 1 deletion cargo-shuttle/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ reqwest = { workspace = true, features = ["json"] }
reqwest-middleware = "0.2.0"
reqwest-retry = "0.3.0"
rmp-serde = { workspace = true }
semver = "1.0.17"
semver = { workspace = true }
serde = { workspace = true, features = ["derive"] }
serde_json = { workspace = true }
strum = { workspace = true }
Expand Down
42 changes: 28 additions & 14 deletions cargo-shuttle/src/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use serde::{Deserialize, Serialize};
use shuttle_common::models::deployment::DeploymentRequest;
use shuttle_common::models::{deployment, project, secret, service, ToJson};
use shuttle_common::project::ProjectName;
use shuttle_common::{resource, ApiKey, ApiUrl, LogItem};
use shuttle_common::{resource, ApiKey, ApiUrl, LogItem, VersionInfo};
use tokio::net::TcpStream;
use tokio_tungstenite::tungstenite::client::IntoClientRequest;
use tokio_tungstenite::{connect_async, MaybeTlsStream, WebSocketStream};
Expand All @@ -19,20 +19,42 @@ use uuid::Uuid;
pub struct Client {
api_url: ApiUrl,
api_key: Option<ApiKey>,
client: reqwest::Client,
retry_client: ClientWithMiddleware,
}

impl Client {
pub fn new(api_url: ApiUrl) -> Self {
let client = reqwest::Client::new();
let retry_client = ClientBuilder::new(client.clone())
.with(RetryTransientMiddleware::new_with_policy(
ExponentialBackoff::builder().build_with_max_retries(3),
))
.build();
Self {
api_url,
api_key: None,
client,
retry_client,
}
}

pub fn set_api_key(&mut self, api_key: ApiKey) {
self.api_key = Some(api_key);
}

pub async fn get_api_versions(&self) -> Result<VersionInfo> {
let url = format!("{}/versions", self.api_url);

self.client
.get(url)
.send()
.await?
.json()
.await
.context("parsing API version info")
}

pub async fn deploy(
&self,
project: &ProjectName,
Expand All @@ -47,7 +69,7 @@ impl Client {
.context("serialize DeploymentRequest as a MessagePack byte vector")?;

let url = format!("{}{}", self.api_url, path);
let mut builder = Self::get_retry_client().post(url);
let mut builder = self.retry_client.post(url);
builder = self.set_builder_auth(builder);

builder
Expand Down Expand Up @@ -234,7 +256,7 @@ impl Client {
{
let url = format!("{}{}", self.api_url, path);

let mut builder = Self::get_retry_client().get(url);
let mut builder = self.retry_client.get(url);

builder = self.set_builder_auth(builder);

Expand All @@ -249,7 +271,7 @@ impl Client {
async fn post<T: Serialize>(&self, path: String, body: Option<T>) -> Result<Response> {
let url = format!("{}{}", self.api_url, path);

let mut builder = Self::get_retry_client().post(url);
let mut builder = self.retry_client.post(url);

builder = self.set_builder_auth(builder);

Expand All @@ -265,7 +287,7 @@ impl Client {
async fn put<T: Serialize>(&self, path: String, body: Option<T>) -> Result<Response> {
let url = format!("{}{}", self.api_url, path);

let mut builder = Self::get_retry_client().put(url);
let mut builder = self.retry_client.put(url);

builder = self.set_builder_auth(builder);

Expand All @@ -284,7 +306,7 @@ impl Client {
{
let url = format!("{}{}", self.api_url, path);

let mut builder = Self::get_retry_client().delete(url);
let mut builder = self.retry_client.delete(url);

builder = self.set_builder_auth(builder);

Expand All @@ -303,12 +325,4 @@ impl Client {
builder
}
}

fn get_retry_client() -> ClientWithMiddleware {
let retry_policy = ExponentialBackoff::builder().build_with_max_retries(3);

ClientBuilder::new(reqwest::Client::new())
.with(RetryTransientMiddleware::new_with_policy(retry_policy))
.build()
}
}
Loading

0 comments on commit 538473a

Please sign in to comment.