1414#
1515
1616import copy
17+ import mock
1718
1819from openstackclient .compute .v2 import server
1920from openstackclient .tests .compute .v2 import fakes as compute_fakes
2021from openstackclient .tests import fakes
2122from openstackclient .tests .image .v2 import fakes as image_fakes
23+ from openstackclient .tests import utils
2224
2325
2426class TestServer (compute_fakes .TestComputev2 ):
@@ -30,6 +32,10 @@ def setUp(self):
3032 self .servers_mock = self .app .client_manager .compute .servers
3133 self .servers_mock .reset_mock ()
3234
35+ # Get a shortcut to the ImageManager Mock
36+ self .cimages_mock = self .app .client_manager .compute .images
37+ self .cimages_mock .reset_mock ()
38+
3339 # Get a shortcut to the FlavorManager Mock
3440 self .flavors_mock = self .app .client_manager .compute .flavors
3541 self .flavors_mock .reset_mock ()
@@ -39,6 +45,174 @@ def setUp(self):
3945 self .images_mock .reset_mock ()
4046
4147
48+ class TestServerCreate (TestServer ):
49+
50+ def setUp (self ):
51+ super (TestServerCreate , self ).setUp ()
52+
53+ self .servers_mock .create .return_value = fakes .FakeResource (
54+ None ,
55+ copy .deepcopy (compute_fakes .SERVER ),
56+ loaded = True ,
57+ )
58+ new_server = fakes .FakeResource (
59+ None ,
60+ copy .deepcopy (compute_fakes .SERVER ),
61+ loaded = True ,
62+ )
63+ new_server .__dict__ ['networks' ] = {}
64+ self .servers_mock .get .return_value = new_server
65+
66+ self .image = fakes .FakeResource (
67+ None ,
68+ copy .deepcopy (image_fakes .IMAGE ),
69+ loaded = True ,
70+ )
71+ self .cimages_mock .get .return_value = self .image
72+
73+ self .flavor = fakes .FakeResource (
74+ None ,
75+ copy .deepcopy (compute_fakes .FLAVOR ),
76+ loaded = True ,
77+ )
78+ self .flavors_mock .get .return_value = self .flavor
79+
80+ # Get the command object to test
81+ self .cmd = server .CreateServer (self .app , None )
82+
83+ def test_server_create_no_options (self ):
84+ arglist = [
85+ compute_fakes .server_id ,
86+ ]
87+ verifylist = [
88+ ('server_name' , compute_fakes .server_id ),
89+ ]
90+ try :
91+ # Missing required args should bail here
92+ self .check_parser (self .cmd , arglist , verifylist )
93+ except utils .ParserException :
94+ pass
95+
96+ def test_server_create_minimal (self ):
97+ arglist = [
98+ '--image' , 'image1' ,
99+ '--flavor' , 'flavor1' ,
100+ compute_fakes .server_id ,
101+ ]
102+ verifylist = [
103+ ('image' , 'image1' ),
104+ ('flavor' , 'flavor1' ),
105+ ('config_drive' , False ),
106+ ('server_name' , compute_fakes .server_id ),
107+ ]
108+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
109+
110+ # DisplayCommandBase.take_action() returns two tuples
111+ columns , data = self .cmd .take_action (parsed_args )
112+
113+ # Set expected values
114+ kwargs = dict (
115+ meta = None ,
116+ files = {},
117+ reservation_id = None ,
118+ min_count = 1 ,
119+ max_count = 1 ,
120+ security_groups = [],
121+ userdata = None ,
122+ key_name = None ,
123+ availability_zone = None ,
124+ block_device_mapping = {},
125+ nics = [],
126+ scheduler_hints = {},
127+ config_drive = None ,
128+ )
129+ # ServerManager.create(name, image, flavor, **kwargs)
130+ self .servers_mock .create .assert_called_with (
131+ compute_fakes .server_id ,
132+ self .image ,
133+ self .flavor ,
134+ ** kwargs
135+ )
136+
137+ collist = ('addresses' , 'flavor' , 'id' , 'image' , 'name' , 'properties' )
138+ self .assertEqual (columns , collist )
139+ datalist = (
140+ '' ,
141+ 'Large ()' ,
142+ compute_fakes .server_id ,
143+ 'graven ()' ,
144+ compute_fakes .server_name ,
145+ '' ,
146+ )
147+ self .assertEqual (data , datalist )
148+
149+ @mock .patch ('openstackclient.compute.v2.server.io.open' )
150+ def test_server_create_userdata (self , mock_open ):
151+ mock_file = mock .MagicMock (name = 'File' )
152+ mock_open .return_value = mock_file
153+ mock_open .read .return_value = '#!/bin/sh'
154+
155+ arglist = [
156+ '--image' , 'image1' ,
157+ '--flavor' , 'flavor1' ,
158+ '--user-data' , 'userdata.sh' ,
159+ compute_fakes .server_id ,
160+ ]
161+ verifylist = [
162+ ('image' , 'image1' ),
163+ ('flavor' , 'flavor1' ),
164+ ('user_data' , 'userdata.sh' ),
165+ ('config_drive' , False ),
166+ ('server_name' , compute_fakes .server_id ),
167+ ]
168+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
169+
170+ # DisplayCommandBase.take_action() returns two tuples
171+ columns , data = self .cmd .take_action (parsed_args )
172+
173+ # Ensure the userdata file is opened
174+ mock_open .assert_called_with ('userdata.sh' )
175+
176+ # Ensure the userdata file is closed
177+ mock_file .close .assert_called ()
178+
179+ # Set expected values
180+ kwargs = dict (
181+ meta = None ,
182+ files = {},
183+ reservation_id = None ,
184+ min_count = 1 ,
185+ max_count = 1 ,
186+ security_groups = [],
187+ userdata = mock_file ,
188+ key_name = None ,
189+ availability_zone = None ,
190+ block_device_mapping = {},
191+ nics = [],
192+ scheduler_hints = {},
193+ config_drive = None ,
194+ )
195+ # ServerManager.create(name, image, flavor, **kwargs)
196+ self .servers_mock .create .assert_called_with (
197+ compute_fakes .server_id ,
198+ self .image ,
199+ self .flavor ,
200+ ** kwargs
201+ )
202+
203+ collist = ('addresses' , 'flavor' , 'id' , 'image' , 'name' , 'properties' )
204+ self .assertEqual (columns , collist )
205+ datalist = (
206+ '' ,
207+ 'Large ()' ,
208+ compute_fakes .server_id ,
209+ 'graven ()' ,
210+ compute_fakes .server_name ,
211+ '' ,
212+ )
213+ self .assertEqual (data , datalist )
214+
215+
42216class TestServerDelete (TestServer ):
43217
44218 def setUp (self ):
0 commit comments