diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d5ac206584..5e442e2e337 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,50 @@ This project uses [*towncrier*](https://towncrier.readthedocs.io/) and the chang +## [3.132.1](https://github.com/metalbear-co/mirrord/tree/3.132.1) - 2025-02-06 + + +### Fixed + +- Fixed operator connect URL produced by the CLI when a target container is + specified. + +## [3.132.0](https://github.com/metalbear-co/mirrord/tree/3.132.0) - 2025-02-06 + + +### Removed + +- Removed faulty `statfs` hook for Go applications. + + +### Added + +- Added Kubernetes ReplicaSet as a new target type (requires mirrord Operator). + + +### Changed + +- Namespace for `targetless` runs is now specified with the + `target.namespace` config field (or the `MIRRORD_TARGET_NAMESPACE` + environment variable). + `agent.namespace` field is ignored in targetless runs. + + +### Internal + +- Some code snippets in the configuration documentation were missing the + closing backticks, which resulted in bad formatting when converted to + markdown and displayed on the website. +- Added instructions to CONTRIBUTING.md for changing the agent log level in + mirrord config. +- Added mirrord policy support for specifying pattern requirment for header + filter when performing steal-with-filter. +- Removed `envfile` dependency. +- Update policy doc for http_filter header. +- Updated `tests::operator::sanity::mirrord_ls` test after adding ReplicaSet + support. +- `mirrord-kube` now allows for setting agent listen port. + ## [3.131.2](https://github.com/metalbear-co/mirrord/tree/3.131.2) - 2025-01-29 diff --git a/Cargo.lock b/Cargo.lock index b219ab26fd0..6c7f50c877a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2410,7 +2410,7 @@ dependencies = [ [[package]] name = "fileops" -version = "3.131.2" +version = "3.132.1" dependencies = [ "libc", ] @@ -3528,7 +3528,7 @@ checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "issue1317" -version = "3.131.2" +version = "3.132.1" dependencies = [ "actix-web", "env_logger 0.11.6", @@ -3538,7 +3538,7 @@ dependencies = [ [[package]] name = "issue1776" -version = "3.131.2" +version = "3.132.1" dependencies = [ "errno 0.3.10", "libc", @@ -3547,7 +3547,7 @@ dependencies = [ [[package]] name = "issue1776portnot53" -version = "3.131.2" +version = "3.132.1" dependencies = [ "libc", "socket2", @@ -3555,14 +3555,14 @@ dependencies = [ [[package]] name = "issue1899" -version = "3.131.2" +version = "3.132.1" dependencies = [ "libc", ] [[package]] name = "issue2001" -version = "3.131.2" +version = "3.132.1" dependencies = [ "libc", ] @@ -3883,7 +3883,7 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "listen_ports" -version = "3.131.2" +version = "3.132.1" [[package]] name = "litemap" @@ -4124,7 +4124,7 @@ dependencies = [ [[package]] name = "mirrord" -version = "3.131.2" +version = "3.132.1" dependencies = [ "actix-codec", "clap", @@ -4180,7 +4180,7 @@ dependencies = [ [[package]] name = "mirrord-agent" -version = "3.131.2" +version = "3.132.1" dependencies = [ "actix-codec", "async-trait", @@ -4247,7 +4247,7 @@ dependencies = [ [[package]] name = "mirrord-analytics" -version = "3.131.2" +version = "3.132.1" dependencies = [ "assert-json-diff", "base64 0.22.1", @@ -4261,7 +4261,7 @@ dependencies = [ [[package]] name = "mirrord-auth" -version = "3.131.2" +version = "3.132.1" dependencies = [ "bcder", "chrono", @@ -4282,7 +4282,7 @@ dependencies = [ [[package]] name = "mirrord-config" -version = "3.131.2" +version = "3.132.1" dependencies = [ "base64 0.22.1", "bimap", @@ -4306,7 +4306,7 @@ dependencies = [ [[package]] name = "mirrord-config-derive" -version = "3.131.2" +version = "3.132.1" dependencies = [ "proc-macro2", "proc-macro2-diagnostics", @@ -4316,7 +4316,7 @@ dependencies = [ [[package]] name = "mirrord-console" -version = "3.131.2" +version = "3.132.1" dependencies = [ "bincode", "drain", @@ -4332,7 +4332,7 @@ dependencies = [ [[package]] name = "mirrord-intproxy" -version = "3.131.2" +version = "3.132.1" dependencies = [ "bytes", "exponential-backoff", @@ -4360,7 +4360,7 @@ dependencies = [ [[package]] name = "mirrord-intproxy-protocol" -version = "3.131.2" +version = "3.132.1" dependencies = [ "bincode", "mirrord-protocol", @@ -4370,7 +4370,7 @@ dependencies = [ [[package]] name = "mirrord-kube" -version = "3.131.2" +version = "3.132.1" dependencies = [ "actix-codec", "async-stream", @@ -4395,7 +4395,7 @@ dependencies = [ [[package]] name = "mirrord-layer" -version = "3.131.2" +version = "3.132.1" dependencies = [ "actix-codec", "base64 0.22.1", @@ -4438,7 +4438,7 @@ dependencies = [ [[package]] name = "mirrord-layer-macro" -version = "3.131.2" +version = "3.132.1" dependencies = [ "proc-macro2", "quote", @@ -4447,7 +4447,7 @@ dependencies = [ [[package]] name = "mirrord-macros" -version = "3.131.2" +version = "3.132.1" dependencies = [ "proc-macro2", "proc-macro2-diagnostics", @@ -4457,7 +4457,7 @@ dependencies = [ [[package]] name = "mirrord-operator" -version = "3.131.2" +version = "3.132.1" dependencies = [ "base64 0.22.1", "bincode", @@ -4490,7 +4490,7 @@ dependencies = [ [[package]] name = "mirrord-progress" -version = "3.131.2" +version = "3.132.1" dependencies = [ "enum_dispatch", "indicatif", @@ -4524,7 +4524,7 @@ dependencies = [ [[package]] name = "mirrord-sip" -version = "3.131.2" +version = "3.132.1" dependencies = [ "apple-codesign", "object 0.36.7", @@ -4537,7 +4537,7 @@ dependencies = [ [[package]] name = "mirrord-vpn" -version = "3.131.2" +version = "3.132.1" dependencies = [ "futures", "ipnet", @@ -4885,7 +4885,7 @@ dependencies = [ [[package]] name = "outgoing" -version = "3.131.2" +version = "3.132.1" [[package]] name = "outref" @@ -5992,14 +5992,14 @@ dependencies = [ [[package]] name = "rust-bypassed-unix-socket" -version = "3.131.2" +version = "3.132.1" dependencies = [ "tokio", ] [[package]] name = "rust-e2e-fileops" -version = "3.131.2" +version = "3.132.1" dependencies = [ "libc", ] @@ -6015,7 +6015,7 @@ dependencies = [ [[package]] name = "rust-unix-socket-client" -version = "3.131.2" +version = "3.132.1" dependencies = [ "tokio", ] diff --git a/Cargo.toml b/Cargo.toml index 63da49184f9..7667017abcc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,7 +28,7 @@ resolver = "2" # latest commits on rustls suppress certificate verification [workspace.package] -version = "3.131.2" +version = "3.132.1" edition = "2021" license = "MIT" readme = "README.md" diff --git a/changelog.d/+agent-log-level-instructions.internal.md b/changelog.d/+agent-log-level-instructions.internal.md deleted file mode 100644 index 9514b85abcd..00000000000 --- a/changelog.d/+agent-log-level-instructions.internal.md +++ /dev/null @@ -1 +0,0 @@ -Add instructions to CONTRIBUTING.md for changing the agent log level in mirrord config. \ No newline at end of file diff --git a/changelog.d/+any-off-docs.fixed.md b/changelog.d/+any-off-docs.fixed.md deleted file mode 100644 index a8579fde412..00000000000 --- a/changelog.d/+any-off-docs.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Some code snippets in the configuration documentation were missing the closing backticks, which resulted in bad formatting when converted to markdown and displayed on the website. diff --git a/changelog.d/+ls-test.internal.md b/changelog.d/+ls-test.internal.md deleted file mode 100644 index f8c1eccecd5..00000000000 --- a/changelog.d/+ls-test.internal.md +++ /dev/null @@ -1 +0,0 @@ -Updated `tests::operator::sanity::mirrord_ls` test after adding ReplicaSet support. diff --git a/changelog.d/+operator-policy-http-filter.internal.md b/changelog.d/+operator-policy-http-filter.internal.md deleted file mode 100644 index fd9e4b63e18..00000000000 --- a/changelog.d/+operator-policy-http-filter.internal.md +++ /dev/null @@ -1 +0,0 @@ -Add mirrord policy support for specifying pattern requirment for header filter when performing steal-with-filter. diff --git a/changelog.d/+policy-dock-update.internal.md b/changelog.d/+policy-dock-update.internal.md deleted file mode 100644 index 90681cb19d1..00000000000 --- a/changelog.d/+policy-dock-update.internal.md +++ /dev/null @@ -1 +0,0 @@ -Update policy doc for http_filter header. diff --git a/changelog.d/+removed-envfile.internal.md b/changelog.d/+removed-envfile.internal.md deleted file mode 100644 index a6d50c5dfa8..00000000000 --- a/changelog.d/+removed-envfile.internal.md +++ /dev/null @@ -1 +0,0 @@ -Removed `envfile` dependency. diff --git a/changelog.d/+replicaset-target.added.md b/changelog.d/+replicaset-target.added.md deleted file mode 100644 index 39f3a35347f..00000000000 --- a/changelog.d/+replicaset-target.added.md +++ /dev/null @@ -1 +0,0 @@ -Added Kubernetes ReplicaSet as a new target type. diff --git a/changelog.d/+set-agent-port.internal.md b/changelog.d/+set-agent-port.internal.md deleted file mode 100644 index 6fc1f928401..00000000000 --- a/changelog.d/+set-agent-port.internal.md +++ /dev/null @@ -1 +0,0 @@ -`mirrord-kube` now allows for setting agent listen port. diff --git a/changelog.d/+statfs-go-hook.removed.md b/changelog.d/+statfs-go-hook.removed.md deleted file mode 100644 index 3c94b799360..00000000000 --- a/changelog.d/+statfs-go-hook.removed.md +++ /dev/null @@ -1 +0,0 @@ -Removed faulty `statfs` hook for Go applications. diff --git a/changelog.d/+targetless-namespace.changed.md b/changelog.d/+targetless-namespace.changed.md deleted file mode 100644 index 12189203701..00000000000 --- a/changelog.d/+targetless-namespace.changed.md +++ /dev/null @@ -1,2 +0,0 @@ -Namespace for `targetless` runs is now be specified with the `target.namespace` config field (or the `MIRRORD_TARGET_NAMESPACE` environment variable). -`agent.namespace` field is ignored in targetless runs. diff --git a/mirrord/operator/src/client.rs b/mirrord/operator/src/client.rs index 970c92e49c6..f2407ca80ac 100644 --- a/mirrord/operator/src/client.rs +++ b/mirrord/operator/src/client.rs @@ -626,8 +626,15 @@ impl OperatorApi { } } + let use_proxy = self + .operator + .spec + .supported_features() + .contains(&NewOperatorFeature::ProxyApi); + ( - self.target_connect_url( + Self::target_connect_url( + use_proxy, &target, layer_config.feature.network.incoming.on_concurrent_steal, ), @@ -664,16 +671,10 @@ impl OperatorApi { /// Produces the URL for making a connection request to the operator. fn target_connect_url( - &self, + use_proxy: bool, target: &ResolvedTarget, concurrent_steal: ConcurrentSteal, ) -> String { - let use_proxy = self - .operator - .spec - .supported_features() - .contains(&NewOperatorFeature::ProxyApi); - let name = { let mut urlfied_name = target.type_().to_string(); if let Some(target_name) = target.name() { @@ -681,7 +682,7 @@ impl OperatorApi { urlfied_name.push_str(target_name); } if let Some(target_container) = target.container() { - urlfied_name.push('.'); + urlfied_name.push_str(".container."); urlfied_name.push_str(target_container); } urlfied_name @@ -826,3 +827,97 @@ impl OperatorApi { )) } } + +#[cfg(test)] +mod test { + use k8s_openapi::api::apps::v1::Deployment; + use kube::api::ObjectMeta; + use mirrord_config::feature::network::incoming::ConcurrentSteal; + use mirrord_kube::resolved::{ResolvedResource, ResolvedTarget}; + use rstest::rstest; + + use super::OperatorApi; + + /// Verifies that [`OperatorApi::target_connect_url`] produces expected URLs. + /// + /// These URLs should not change for backward compatibility. + #[rstest] + #[case::deployment_no_container_no_proxy( + false, + ResolvedTarget::Deployment(ResolvedResource { + resource: Deployment { + metadata: ObjectMeta { + name: Some("py-serv-deployment".into()), + namespace: Some("default".into()), + ..Default::default() + }, + spec: None, + status: None, + }, + container: None, + }), + ConcurrentSteal::Abort, + "/apis/operator.metalbear.co/v1/namespaces/default/targets/deployment.py-serv-deployment?on_concurrent_steal=abort&connect=true" + )] + #[case::deployment_no_container_proxy( + true, + ResolvedTarget::Deployment(ResolvedResource { + resource: Deployment { + metadata: ObjectMeta { + name: Some("py-serv-deployment".into()), + namespace: Some("default".into()), + ..Default::default() + }, + spec: None, + status: None, + }, + container: None, + }), + ConcurrentSteal::Abort, + "/apis/operator.metalbear.co/v1/proxy/namespaces/default/targets/deployment.py-serv-deployment?on_concurrent_steal=abort&connect=true" + )] + #[case::deployment_container_no_proxy( + false, + ResolvedTarget::Deployment(ResolvedResource { + resource: Deployment { + metadata: ObjectMeta { + name: Some("py-serv-deployment".into()), + namespace: Some("default".into()), + ..Default::default() + }, + spec: None, + status: None, + }, + container: Some("py-serv".into()), + }), + ConcurrentSteal::Abort, + "/apis/operator.metalbear.co/v1/namespaces/default/targets/deployment.py-serv-deployment.container.py-serv?on_concurrent_steal=abort&connect=true" + )] + #[case::deployment_container_proxy( + true, + ResolvedTarget::Deployment(ResolvedResource { + resource: Deployment { + metadata: ObjectMeta { + name: Some("py-serv-deployment".into()), + namespace: Some("default".into()), + ..Default::default() + }, + spec: None, + status: None, + }, + container: Some("py-serv".into()), + }), + ConcurrentSteal::Abort, + "/apis/operator.metalbear.co/v1/proxy/namespaces/default/targets/deployment.py-serv-deployment.container.py-serv?on_concurrent_steal=abort&connect=true" + )] + #[test] + fn target_connect_url( + #[case] use_proxy: bool, + #[case] target: ResolvedTarget, + #[case] concurrent_steal: ConcurrentSteal, + #[case] expected: &str, + ) { + let produced = OperatorApi::target_connect_url(use_proxy, &target, concurrent_steal); + assert_eq!(produced, expected,) + } +}