207 lines
5.7 KiB
Rust
207 lines
5.7 KiB
Rust
use std::collections::BTreeMap;
|
|
|
|
use harmony_macros::yaml;
|
|
use inquire::Confirm;
|
|
use k8s_openapi::{
|
|
api::{
|
|
apps::v1::{Deployment, DeploymentSpec},
|
|
core::v1::{Container, PodSpec, PodTemplateSpec},
|
|
},
|
|
apimachinery::pkg::apis::meta::v1::LabelSelector,
|
|
};
|
|
use kube::{
|
|
Api, Client, ResourceExt,
|
|
api::{ObjectMeta, PostParams},
|
|
};
|
|
|
|
#[tokio::main]
|
|
async fn main() {
|
|
let confirmation = Confirm::new(
|
|
"This will install various ressources to your default kubernetes cluster. Are you sure?",
|
|
)
|
|
.with_default(false)
|
|
.prompt()
|
|
.expect("Unexpected prompt error");
|
|
|
|
if !confirmation {
|
|
return;
|
|
}
|
|
|
|
let client = Client::try_default()
|
|
.await
|
|
.expect("Should instanciate client from defaults");
|
|
println!("apiserver_version {:?}", client.apiserver_version().await);
|
|
println!("default namespace {:?}", client.default_namespace());
|
|
// println!(
|
|
// "apiserver_groups {:?}",
|
|
// client
|
|
// .list_api_groups()
|
|
// .await
|
|
// .unwrap()
|
|
// .groups
|
|
// .iter()
|
|
// .map(|g| g.name.clone())
|
|
// .collect::<Vec<_>>()
|
|
// );
|
|
|
|
// let pods: Api<Pod> = Api::default_namespaced(client.clone());
|
|
// for p in pods.list(&ListParams::default()).await.unwrap() {
|
|
// println!("found pod {}", p.name_any())
|
|
// }
|
|
|
|
// let nodes : Api<Node> = Api::all(client.clone());
|
|
// for n in nodes.list(&ListParams::default()).await.unwrap() {
|
|
// println!("found node {} status {:?}", n.name_any(), n.status.unwrap())
|
|
// }
|
|
|
|
assert_eq!(nginx_deployment(), nginx_macro());
|
|
assert_eq!(nginx_deployment_2(), nginx_macro());
|
|
assert_eq!(nginx_deployment_serde(), nginx_macro());
|
|
let nginxdeployment = nginx_macro();
|
|
let deployment: Api<Deployment> = Api::default_namespaced(client.clone());
|
|
match deployment
|
|
.create(&PostParams::default(), &nginxdeployment)
|
|
.await
|
|
{
|
|
Ok(_d) => println!("Deployment success"),
|
|
Err(e) => {
|
|
println!("Error creating deployment {}", e);
|
|
if let kube::Error::Api(error_response) = &e {
|
|
if error_response.code == http::StatusCode::CONFLICT.as_u16() {
|
|
println!("Already exists");
|
|
return;
|
|
}
|
|
}
|
|
panic!("{}", e)
|
|
}
|
|
};
|
|
println!(
|
|
"{:?}",
|
|
deployment
|
|
.get_status(&nginxdeployment.name_unchecked())
|
|
.await
|
|
.unwrap()
|
|
);
|
|
println!("Hello world");
|
|
}
|
|
|
|
fn nginx_macro() -> Deployment {
|
|
yaml!(
|
|
r#"
|
|
metadata:
|
|
name: "nginx-test"
|
|
spec:
|
|
selector:
|
|
matchLabels:
|
|
app: nginx-test
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: nginx-test
|
|
spec:
|
|
containers:
|
|
- image: nginx
|
|
name: nginx"#
|
|
)
|
|
.unwrap()
|
|
}
|
|
|
|
fn nginx_deployment_serde() -> Deployment {
|
|
let deployment: Deployment = serde_yaml::from_str(
|
|
r#"
|
|
metadata:
|
|
name: "nginx-test"
|
|
spec:
|
|
selector:
|
|
matchLabels:
|
|
app: nginx-test
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: nginx-test
|
|
spec:
|
|
containers:
|
|
- image: nginx
|
|
name: nginx"#,
|
|
)
|
|
.unwrap();
|
|
return deployment;
|
|
}
|
|
fn nginx_deployment_2() -> Deployment {
|
|
let mut pod_template = PodTemplateSpec::default();
|
|
pod_template.metadata = Some(ObjectMeta {
|
|
labels: Some(BTreeMap::from([(
|
|
"app".to_string(),
|
|
"nginx-test".to_string(),
|
|
)])),
|
|
..Default::default()
|
|
});
|
|
pod_template.spec = Some(PodSpec {
|
|
containers: vec![Container {
|
|
name: "nginx".to_string(),
|
|
image: Some("nginx".to_string()),
|
|
..Default::default()
|
|
}],
|
|
..Default::default()
|
|
});
|
|
let mut spec = DeploymentSpec::default();
|
|
spec.template = pod_template;
|
|
spec.selector = LabelSelector {
|
|
match_expressions: None,
|
|
match_labels: Some(BTreeMap::from([(
|
|
"app".to_string(),
|
|
"nginx-test".to_string(),
|
|
)])),
|
|
};
|
|
|
|
let mut deployment = Deployment::default();
|
|
deployment.spec = Some(spec);
|
|
deployment.metadata.name = Some("nginx-test".to_string());
|
|
|
|
deployment
|
|
}
|
|
|
|
fn nginx_deployment() -> Deployment {
|
|
let deployment = Deployment {
|
|
metadata: ObjectMeta {
|
|
name: Some("nginx-test".to_string()),
|
|
..Default::default()
|
|
},
|
|
spec: Some(DeploymentSpec {
|
|
min_ready_seconds: None,
|
|
paused: None,
|
|
progress_deadline_seconds: None,
|
|
replicas: Some(1),
|
|
revision_history_limit: Some(10),
|
|
selector: LabelSelector {
|
|
match_expressions: None,
|
|
match_labels: Some(BTreeMap::from([(
|
|
"app".to_string(),
|
|
"nginx-test".to_string(),
|
|
)])),
|
|
},
|
|
strategy: None,
|
|
template: PodTemplateSpec {
|
|
metadata: Some(ObjectMeta {
|
|
labels: Some(BTreeMap::from([(
|
|
"app".to_string(),
|
|
"nginx-test".to_string(),
|
|
)])),
|
|
..Default::default()
|
|
}),
|
|
spec: Some(PodSpec {
|
|
containers: vec![Container {
|
|
name: "nginx".to_string(),
|
|
image: Some("nginx".to_string()),
|
|
..Default::default()
|
|
}],
|
|
..Default::default()
|
|
}),
|
|
},
|
|
}),
|
|
status: None,
|
|
};
|
|
println!("{:?}", deployment.managed_fields());
|
|
deployment
|
|
}
|