sacloud_rs/api/
disk.rs

1//! Sakura Internet API - Disk
2//! https://manual.sakura.ad.jp/cloud-api/1.1/disk/index.html
3//!
4//! - [x] GET    /disk                           - ディスク一覧を取得
5//! - [x] POST   /disk                           - ディスクを作成
6//! - [ ] GET    /disk/:diskid                   - 該当IDのディスク情報を取得
7//! - [ ] PUT    /disk/:diskid                   - ディスク情報を更新
8//! - [ ] DELETE /disk/:diskid                   - 該当IDのディスクを削除
9//! - [ ] PUT    /disk/:diskid/config            - ディスクの内容を書き換える
10//! - [ ] GET    /disk/:diskid/monitor           - ディスクのリソースモニタ情報を取得
11//! - [ ] PUT    /disk/:diskid/plan              - 該当IDのディスクのプランを変更
12//! - [ ] PUT    /disk/:diskid/resize-partition  - ディスクのパーティションサイズを最適化する
13//! - [ ] GET    /disk/:diskid/tag               - 該当IDのディスクに付けられたタグを取得
14//! - [ ] PUT    /disk/:diskid/tag               - 該当IDのディスクに付けられるタグを変更
15//! - [ ] PUT    /disk/:diskid/to/blank          - ディスクを空にする
16//! - [ ] DELETE /disk/:diskid/to/server         - ディスクとサーバの接続を解除
17//! - [x] PUT    /disk/:diskid/to/server/:serverid - ディスクとサーバを接続
18//! - [ ] GET    /disk/tag                       - ディスクタグ一覧を取得
19
20use serde::{Deserialize, Serialize};
21
22// Disk plan
23create_struct!(Plan, "PascalCase",
24    name: String
25);
26
27create_struct!(Server, "PascalCase",
28    name: String
29);
30
31create_struct!(Disk, "PascalCase",
32    i_d: String,
33    name: String,
34    size_m_b: usize,
35    created_at: String,
36    plan: Plan,
37    availability: String,
38    server: Option<Server>
39);
40
41create_struct!(DiskList, "PascalCase",
42    from: usize,
43    count: usize,
44    total: usize,
45    disks: Vec<Disk>
46);
47
48create_struct!(DiskCreated, "PascalCase",
49    success: String,
50    disk: Disk
51);
52
53create_struct!(DiskQuery, "PascalCase",
54    disk: Disk
55);
56
57#[cfg(test)]
58mod tests {
59    use ssh2::Session;
60
61    use crate::api::server;
62    use crate::Client;
63    use crate::Zone;
64
65    use super::*;
66
67    #[tokio::test]
68    #[ignore]
69    async fn test_get_disk() {
70        let client = Client::default().set_zone(Zone::Tokyo2);
71        let dl: DiskList = client.clear().disk().get().await.unwrap();
72        assert_eq!(dl.total, 0);
73    }
74
75    #[tokio::test]
76    #[ignore]
77    async fn test_post_disk() {
78        let zone = Zone::Tokyo2;
79        let client = Client::default().set_zone(zone);
80        // no disk in the zone
81        let dl: DiskList = client.clone().clear().disk().get().await.unwrap();
82        assert_eq!(dl.total, 0);
83        // create 1 disk
84        let ssh_key_path = home::home_dir().unwrap().join(".ssh").join("id_rsa.pub");
85        let ssh_key = std::fs::read_to_string(&ssh_key_path).unwrap();
86        let dpl: crate::api::product::DiskPlanList =
87            client.clone().clear().product().disk().get().await.unwrap();
88        let ubuntu_2204 = 113402076879;
89        let disk_id = shortcuts::create(
90            client.clone(),
91            "test_disk",
92            dpl.disk_plans[0].i_d,
93            20480,
94            ubuntu_2204,
95            &ssh_key,
96        )
97        .await
98        .unwrap();
99        let dl: DiskList = client.clone().clear().disk().get().await.unwrap();
100        assert_eq!(dl.total, 1);
101        // create a server
102        let spl: crate::api::product::ServerPlanList = client
103            .clone()
104            .clear()
105            .product()
106            .server()
107            .get()
108            .await
109            .unwrap();
110        let server_id =
111            server::shortcuts::create(client.clone(), "test_server", spl.server_plans[0].i_d)
112                .await
113                .unwrap();
114        // connect disk and server
115        let _ = client
116            .clone()
117            .clear()
118            .disk()
119            .diskid(&disk_id)
120            .to()
121            .server()
122            .serverid(&server_id)
123            .put()
124            .await
125            .unwrap();
126        // power on server
127        server::shortcuts::power_on(client.clone(), &server_id)
128            .await
129            .unwrap();
130        // test ssh
131        let server_query: server::ServerQuery = client
132            .clone()
133            .server()
134            .serverid(&server_id)
135            .get()
136            .await
137            .unwrap();
138        let ip_addr = server_query.server.interfaces[0]
139            .i_p_address
140            .as_ref()
141            .unwrap();
142        let tcp = std::net::TcpStream::connect(format!("{}:22", ip_addr)).unwrap();
143        let mut sess = Session::new().unwrap();
144        sess.set_tcp_stream(tcp);
145        sess.handshake().unwrap();
146        let home_dir = home::home_dir().unwrap();
147        let private_file = home_dir.join(".ssh").join("id_rsa");
148        sess.userauth_pubkey_file("ubuntu", None, private_file.as_path(), None)
149            .unwrap();
150        assert!(sess.authenticated());
151        // shut down server
152        server::shortcuts::power_off(client.clone(), &server_id).await.unwrap();
153        // delete the disks
154        for disk in dl.disks.iter() {
155            let _res = client
156                .clone()
157                .clear()
158                .disk()
159                .diskid(&disk.i_d)
160                .delete()
161                .await
162                .unwrap();
163        }
164        // delete the server & the disk
165        let delte_params = crate::api::server::params::ParamsWithDisk::default()
166            .disk_ids(vec![disk_id.parse::<usize>().unwrap()]);
167        let _res = client
168            .clone()
169            .clear()
170            .server()
171            .serverid(&server_id)
172            .set_params(&delte_params)
173            .unwrap()
174            .delete()
175            .await
176            .unwrap();
177        let sl: crate::api::server::ServerList =
178            client.clone().clear().server().get().await.unwrap();
179        assert_eq!(sl.total, 0);
180        let dl: DiskList = client.clone().clear().disk().get().await.unwrap();
181        assert_eq!(dl.total, 0);
182    }
183}
184
185pub mod params;
186pub mod shortcuts;