sacloud_rs/api/
server.rs

1//! Sakura Internet API - Server
2//! https://manual.sakura.ad.jp/cloud-api/1.1/server/index.html
3//!
4//! - [ ] GET    /privatehost                         - 専有ホスト契約を検索・一覧を取得
5//! - [ ] POST   /privatehost                         - 専有ホスト契約を作成
6//! - [ ] GET    /privatehost/:privatehostid          - 該当IDの専有ホスト契約情報を取得
7//! - [ ] PUT    /privatehost/:privatehostid          - 専有ホスト契約情報を更新
8//! - [ ] DELETE /privatehost/:privatehostid          - 該当IDの専有ホスト契約を削除
9//! - [x] GET    /server                              - サーバを検索・一覧を取得
10//! - [x] POST   /server                              - サーバを作成
11//! - [ ] GET    /server/:serverid                    - 該当IDのサーバ情報を取得
12//! - [x] PUT    /server/:serverid                    - サーバ情報を更新
13//! - [ ] DELETE /server/:serverid                    - 該当IDのサーバを削除
14//! - [ ] GET    /server/:serverid/cdrom              - 該当IDのサーバに挿入されたISOイメージの状態を取得
15//! - [ ] PUT    /server/:serverid/cdrom              - 該当IDのサーバにISOイメージを挿入
16//! - [ ] DELETE /server/:serverid/cdrom              - 該当IDのサーバからISOイメージを排出
17//! - [ ] GET    /server/:serverid/interface          - 該当IDのサーバが備えるインタフェースを取得
18//! - [ ] PUT    /server/:serverid/keyboard           - 該当IDのサーバのキーボードを押下
19//! - [ ] GET    /server/:serverid/monitor            - 該当IDのサーバのリソースモニタ情報を取得
20//! - [ ] PUT    /server/:serverid/mouse/:mouseindex  - 該当IDのサーバのマウスを操作
21//! - [ ] PUT    /server/:serverid/plan               - 該当IDのサーバのプランを変更
22//! - [x] GET    /server/:serverid/power              - 該当IDのサーバの起動状態を取得
23//! - [x] PUT    /server/:serverid/power              - 該当IDのサーバを起動
24//! - [x] DELETE /server/:serverid/power              - 該当IDのサーバを停止、または強制停止
25//! - [ ] PUT    /server/:serverid/qemu/nmi           - nmi 情報の取得
26//! - [ ] PUT    /server/:serverid/reset              - 該当IDのサーバのリセットボタンを押下
27//! - [ ] GET    /server/:serverid/tag                - 該当IDのサーバに付けられたタグを取得
28//! - [ ] PUT    /server/:serverid/tag                - 該当IDのサーバに付けられるタグを変更
29//! - [ ] PUT    /server/:serverid/to/plan/:planid    - 該当IDのサーバのプランを変更
30//! - [ ] GET    /server/:serverid/vnc/proxy          - 該当IDのサーバのVNCプロクシ情報を取得
31//! - [ ] GET    /server/:serverid/vnc/size           - 該当IDのサーバの現在の画面サイズを取得
32//! - [ ] GET    /server/:serverid/vnc/snapshot       - 該当IDのサーバのVNCスナップショットを取得
33//! - [ ] GET    /server/tag                          - サーバタグ一覧を取得
34
35use serde::{Deserialize, Serialize};
36
37create_struct!(ServerPlan, "PascalCase",
38    c_p_u: u8,
39    g_p_u: u8,
40    memory_m_b: u32
41);
42
43create_struct!(Disk, "PascalCase",
44    i_d: String
45);
46
47create_struct!(Server, "PascalCase",
48    i_d: String,
49    name: String,
50    host_name: String,
51    created_at: String,
52    server_plan: ServerPlan,
53    interfaces: Vec<super::interface::Interface>,
54    instance: Instance,
55    disks: Vec<Disk>
56);
57
58create_struct!(ServerList, "PascalCase",
59    from: usize,
60    count: usize,
61    total: usize,
62    servers: Vec<Server>
63);
64
65create_struct!(ServerCreated, "PascalCase",
66    success: bool,
67    server: Server
68);
69
70create_struct!(Instance, "PascalCase",
71    status: String,
72    before_status: Option<String>,
73    status_changed_at: Option<String>
74);
75
76create_struct!(ServerStatus, "PascalCase",
77    instance: Instance
78);
79
80create_struct!(ServerQuery, "PascalCase",
81    server: Server
82);
83
84#[cfg(test)]
85mod tests {
86    use super::*;
87    use crate::Client;
88    use crate::Zone;
89
90    #[tokio::test]
91    #[ignore]
92    async fn test_get_servers() {
93        let client = Client::default().set_zone(Zone::Ishikari1);
94        let sl: ServerList = client.clone().server().get().await.unwrap();
95        // for server in sl.servers.iter() {
96        //     println!("{server:?}");
97        // }
98        assert_eq!(sl.total, 1);
99        let server_query: ServerQuery = client
100            .clone()
101            .server()
102            .serverid(&sl.servers[0].i_d)
103            .get()
104            .await
105            .unwrap();
106        assert!(server_query.server.interfaces[0].i_p_address.is_some());
107    }
108
109    #[tokio::test]
110    #[ignore]
111    async fn test_post_server() {
112        let client = Client::default().set_zone(Zone::Tokyo2);
113        // no server in the zone
114        let sl: ServerList = client.clone().clear().server().get().await.unwrap();
115        assert_eq!(sl.total, 0);
116        // create 1 server
117        let spl: crate::api::product::ServerPlanList = client
118            .clone()
119            .clear()
120            .product()
121            .server()
122            .get()
123            .await
124            .unwrap();
125        let create_params = params::Params::default()
126            .name("test_server")
127            .server_plan(spl.server_plans[0].i_d);
128        let new_server: ServerCreated = client
129            .clone()
130            .clear()
131            .server()
132            .set_params(&create_params)
133            .unwrap()
134            .post()
135            .await
136            .unwrap();
137        assert!(new_server.success);
138        let sl: ServerList = client.clone().clear().server().get().await.unwrap();
139        assert_eq!(sl.total, 1);
140        // create interface
141        let if_params =
142            crate::api::interface::parameter::Params::default().server_id(new_server.server.i_d);
143        let i_f: crate::api::interface::InterfaceCreated = client
144            .clone()
145            .clear()
146            .interface()
147            .set_params(&if_params)
148            .unwrap()
149            .post()
150            .await
151            .unwrap();
152        assert!(i_f.success);
153        // connected to shared switch
154        client
155            .clone()
156            .clear()
157            .interface()
158            .interfaceid(&i_f.interface.i_d)
159            .to()
160            .switch()
161            .shared()
162            .put()
163            .await
164            .unwrap();
165        // delete the server
166        let delte_params = params::ParamsWithDisk::default().disk_ids(vec![]);
167        let sl: ServerList = client.clone().clear().server().get().await.unwrap();
168        for server in sl.servers.iter() {
169            let _res = client
170                .clone()
171                .clear()
172                .server()
173                .serverid(&server.i_d)
174                .set_params(&delte_params)
175                .unwrap()
176                .delete()
177                .await
178                .unwrap();
179        }
180        let sl: ServerList = client.clone().clear().server().get().await.unwrap();
181        assert_eq!(sl.total, 0);
182    }
183
184    #[tokio::test]
185    #[ignore]
186    async fn test_server_power() {
187        let zone = Zone::Tokyo2;
188        let client = Client::default().set_zone(zone);
189        let spl: crate::api::product::ServerPlanList =
190            client.clone().product().server().get().await.unwrap();
191        // create server
192        let server_id = shortcuts::create(client.clone(), "test_server", spl.server_plans[0].i_d)
193            .await
194            .unwrap();
195        let server_status: ServerStatus = client
196            .clone()
197            .clear()
198            .server()
199            .serverid(&server_id)
200            .power()
201            .get()
202            .await
203            .unwrap();
204        assert!(server_status.instance.status == "down");
205        // power on
206        shortcuts::power_on(client.clone(), &server_id)
207            .await
208            .unwrap();
209        // power off
210        shortcuts::power_off(client.clone(), &server_id)
211            .await
212            .unwrap();
213        // delete server
214        shortcuts::remove(client.clone(), &server_id, vec![])
215            .await
216            .unwrap();
217    }
218}
219
220
221pub mod params;
222pub mod shortcuts;