Browse code

win_service - use custom binary for tests (#51689)

(cherry picked from commit 2e99dea8677e2e8fbd9534f6473e65ecacb72896)

Jordan Borean authored on 2019/02/04 19:29:29
Showing 5 changed files
... ...
@@ -1,9 +1,7 @@
1 1
 ---
2
-# parameters set here for creating new service in tests
2
+test_win_service_binary_url: https://s3.amazonaws.com/ansible-ci-files/test/integration/targets/win_service/SleepService.exe
3
+test_win_service_dir: C:\ansible testing\[win_service]
4
+test_win_service_path: '{{ test_win_service_dir }}\SleepService.exe'
3 5
 test_win_service_name: TestService [*abc]
4 6
 test_win_service_display_name: Test Service
5 7
 test_win_service_description: Test Service description
6
-test_win_service_path: C:\Windows\System32\snmptrap.exe
7
-
8
-# used for the pause tests, need to use an actual service
9
-test_win_service_pause_name: TapiSrv
10 8
new file mode 100644
... ...
@@ -0,0 +1,16 @@
0
+using System.ServiceProcess;
1
+
2
+namespace SleepService
3
+{
4
+    internal static class Program
5
+    {
6
+        private static void Main(string[] args)
7
+        {
8
+            ServiceBase.Run(new ServiceBase[1]
9
+            {
10
+                (ServiceBase) new SleepService(args)
11
+            });
12
+        }
13
+    }
14
+}
15
+
0 16
new file mode 100644
... ...
@@ -0,0 +1,85 @@
0
+using System.ComponentModel;
1
+using System.Diagnostics;
2
+using System.Management;
3
+using System.ServiceProcess;
4
+
5
+namespace SleepService
6
+{
7
+    public class SleepService : ServiceBase
8
+    {
9
+        private IContainer components = null;
10
+        private string[] serviceArgs;
11
+        private string displayName;
12
+
13
+        public SleepService(string[] args)
14
+        {
15
+            CanPauseAndContinue = true;
16
+            CanShutdown = true;
17
+            CanStop = true;
18
+            AutoLog = false;
19
+            serviceArgs = args;
20
+            InitializeComponent();
21
+
22
+            string eventSource = "Ansible Test";
23
+            if (!EventLog.SourceExists(eventSource))
24
+                EventLog.CreateEventSource(eventSource, "Application");
25
+            EventLog.Source = eventSource;
26
+            EventLog.Log = "Application";
27
+        }
28
+
29
+        private string GetServiceName()
30
+        {
31
+            using (ManagementObjectCollection.ManagementObjectEnumerator enumerator = new ManagementObjectSearcher(string.Format("SELECT * FROM Win32_Service WHERE ProcessId = {0}", (object)Process.GetCurrentProcess().Id)).Get().GetEnumerator())
32
+            {
33
+                if (enumerator.MoveNext())
34
+                    return enumerator.Current["Name"].ToString();
35
+            }
36
+            return ServiceName;
37
+        }
38
+
39
+        protected override void OnContinue()
40
+        {
41
+            EventLog.WriteEntry(string.Format("{0} OnContinue", displayName));
42
+        }
43
+
44
+        protected override void OnCustomCommand(int command)
45
+        {
46
+            EventLog.WriteEntry(string.Format("{0} OnCustomCommand {1}", displayName, command.ToString()));
47
+        }
48
+
49
+        protected override void OnPause()
50
+        {
51
+            EventLog.WriteEntry(string.Format("{0} OnPause", displayName));
52
+        }
53
+
54
+        protected override void OnStart(string[] args)
55
+        {
56
+            displayName = this.GetServiceName();
57
+            EventLog.WriteEntry(string.Format("{0} OnStart Args:\n{1}", displayName, string.Join("\n", serviceArgs)));
58
+        }
59
+
60
+        protected override void OnShutdown()
61
+        {
62
+            EventLog.WriteEntry(string.Format("{0} OnShutdown", displayName));
63
+        }
64
+
65
+        protected override void OnStop()
66
+        {
67
+            EventLog.WriteEntry(string.Format("{0} OnStop", displayName));
68
+        }
69
+
70
+        protected override void Dispose(bool disposing)
71
+        {
72
+            if (disposing && components != null)
73
+                components.Dispose();
74
+            base.Dispose(disposing);
75
+        }
76
+
77
+        private void InitializeComponent()
78
+        {
79
+            components = new Container();
80
+            ServiceName = nameof(SleepService);
81
+        }
82
+    }
83
+}
84
+
... ...
@@ -16,39 +16,38 @@
16 16
 # You should have received a copy of the GNU General Public License
17 17
 # along with Ansible.  If not, see <http://www.gnu.org/licenses/>.
18 18
 
19
+- name: create test directory
20
+  win_file:
21
+    path: '{{ test_win_service_dir }}'
22
+    state: directory
23
+
24
+# This binary has been pre-compiled with the code in the files directory of this role
25
+- name: download service executable
26
+  win_get_url:
27
+    url: '{{ test_win_service_binary_url }}'
28
+    dest: '{{ test_win_service_path }}'
29
+
19 30
 - name: remove the dummy test services if it is left over from previous tests
20 31
   win_service:
21
-    name: '{{item}}'
32
+    name: '{{ item }}'
22 33
     force_dependent_services: True
23 34
     state: absent
24 35
   with_items:
25
-  - '{{test_win_service_name}}'
36
+  - '{{ test_win_service_name }}'
26 37
   - TestServiceParent2
27 38
   - TestServiceDependency
28 39
 
29
-- name: get details of the {{test_win_service_pause_name}} service
30
-  win_service:
31
-    name: '{{test_win_service_pause_name}}'
32
-  register: pause_service_details
33
-
34 40
 - block:
35 41
   - include_tasks: tests.yml
36 42
 
37 43
   always:
38
-  - name: ensure the {{test_win_service_pause_name}} is set to stopped if it was stopped
44
+  - name: remove test services
39 45
     win_service:
40
-      name: '{{test_win_service_pause_name}}'
41
-      state: stopped
42
-      force_dependent_services: True
43
-    when: pause_service_details.state == 'stopped'
44
-
45
-  - name: make sure all services are removed in the end
46
-    win_service:
47
-      name: '{{item}}'
46
+      name: '{{ item }}'
48 47
       force_dependent_services: True
49 48
       state: absent
50 49
     with_items:
51
-    - '{{test_win_service_name}}'
50
+    - '{{ test_win_service_name }}'
52 51
     - TestServiceParent2
53 52
     - TestServiceDependency
54 53
 
... ...
@@ -57,3 +56,8 @@
57 57
       name: TEST_SERVICE_PATH
58 58
       level: machine
59 59
       state: absent
60
+
61
+  - name: remove test directory
62
+    win_file:
63
+      path: '{{ test_win_service_dir }}'
64
+      state: absent
... ...
@@ -427,7 +427,7 @@
427 427
     - win_service_local_system_desktop is changed
428 428
     - win_service_local_system_desktop.username == 'LocalSystem'
429 429
     - win_service_local_system_desktop.desktop_interact == True
430
-    
430
+
431 431
 - name: set service username to Local System with desktop interaction again
432 432
   win_service:
433 433
     name: "{{test_win_service_name}}"
... ...
@@ -800,116 +800,116 @@
800 800
     - win_service_removed.state is not defined
801 801
     - win_service_removed.username is not defined
802 802
 
803
-# only run these tests if TapiSrv is already stopped, don't want to impact an existing server
804
-- block:
805
-  - name: start the pausable service
806
-    win_service:
807
-      name: '{{test_win_service_pause_name}}'
808
-      state: started
809
-    register: stat_pausable_service
810
-
811
-  - name: assert get details on a pausable service
812
-    assert:
813
-      that:
814
-      - stat_pausable_service.can_pause_and_continue == True
815
-
816
-  - name: pause a service check
817
-    win_service:
818
-      name: '{{test_win_service_pause_name}}'
819
-      state: paused
820
-    register: win_service_paused_check
821
-    check_mode: yes
822
-
823
-  - name: assert pause a service check
824
-    assert:
825
-      that:
826
-      - win_service_paused_check is changed
827
-      - win_service_paused_check.state == 'running'
828
-
829
-  - name: pause a service
830
-    win_service:
831
-      name: '{{test_win_service_pause_name}}'
832
-      state: paused
833
-    register: win_service_paused
834
-
835
-  - name: assert pause a service
836
-    assert:
837
-      that:
838
-      - win_service_paused is changed
839
-      - win_service_paused.state == 'paused'
840
-
841
-  - name: pause a service again
842
-    win_service:
843
-      name: '{{test_win_service_pause_name}}'
844
-      state: paused
845
-    register: win_service_paused_again
846
-
847
-  - name: assert pause a service again
848
-    assert:
849
-      that:
850
-      - win_service_paused_again is not changed
851
-
852
-  - name: start a paused service check
853
-    win_service:
854
-      name: '{{test_win_service_pause_name}}'
855
-      state: started
856
-    register: start_paused_service_check
857
-    check_mode: yes
858
-
859
-  - name: assert start a paused service check
860
-    assert:
861
-      that:
862
-      - start_paused_service_check is changed
863
-      - start_paused_service_check.state == 'paused'
864
-
865
-  - name: start a paused service
866
-    win_service:
867
-      name: '{{test_win_service_pause_name}}'
868
-      state: started
869
-    register: start_paused_service
870
-
871
-  - name: assert start a paused service
872
-    assert:
873
-      that:
874
-      - start_paused_service is changed
875
-      - start_paused_service.state == 'running'
876
-
877
-  - name: pause service for next test
878
-    win_service:
879
-      name: '{{test_win_service_pause_name}}'
880
-      state: paused
881
-
882
-  - name: stop a paused service check
883
-    win_service:
884
-      name: '{{test_win_service_pause_name}}'
885
-      state: stopped
886
-      force_dependent_services: True
887
-    register: stop_paused_service_check
888
-    check_mode: yes
889
-
890
-  - name: assert stop a paused service check
891
-    assert:
892
-      that:
893
-      - stop_paused_service_check is changed
894
-      - stop_paused_service_check.state == 'paused'
895
-
896
-  - name: stop a paused service
897
-    win_service:
898
-      name: '{{test_win_service_pause_name}}'
899
-      state: stopped
900
-      force_dependent_services: True
901
-    register: stop_paused_service
902
-
903
-  - name: assert stop a paused service
904
-    assert:
905
-      that:
906
-      - stop_paused_service is changed
907
-      - stop_paused_service.state == 'stopped'
908
-
909
-  - name: fail to pause a stopped service check
910
-    win_service:
911
-      name: '{{test_win_service_pause_name}}'
912
-      state: paused
913
-    register: fail_pause_stopped_service
914
-    failed_when: "fail_pause_stopped_service.msg != 'failed to pause service ' + test_win_service_pause_name + ': The service does not support pausing'"
915
-  when: pause_service_details.state == 'stopped'
803
+- name: create new pausable dummy test service
804
+  win_service:
805
+    name: "{{test_win_service_name}}"
806
+    path: "{{test_win_service_path}}"
807
+    display_name: "{{test_win_service_display_name}}"
808
+    description: "{{test_win_service_description}}"
809
+    state: started
810
+  register: stat_pausable_service
811
+
812
+- name: assert get details on a pausable service
813
+  assert:
814
+    that:
815
+    - stat_pausable_service.can_pause_and_continue == True
816
+
817
+- name: pause a service check
818
+  win_service:
819
+    name: '{{test_win_service_name}}'
820
+    state: paused
821
+  register: win_service_paused_check
822
+  check_mode: yes
823
+
824
+- name: assert pause a service check
825
+  assert:
826
+    that:
827
+    - win_service_paused_check is changed
828
+    - win_service_paused_check.state == 'running'
829
+
830
+- name: pause a service
831
+  win_service:
832
+    name: '{{test_win_service_name}}'
833
+    state: paused
834
+  register: win_service_paused
835
+
836
+- name: assert pause a service
837
+  assert:
838
+    that:
839
+    - win_service_paused is changed
840
+    - win_service_paused.state == 'paused'
841
+
842
+- name: pause a service again
843
+  win_service:
844
+    name: '{{test_win_service_name}}'
845
+    state: paused
846
+  register: win_service_paused_again
847
+
848
+- name: assert pause a service again
849
+  assert:
850
+    that:
851
+    - win_service_paused_again is not changed
852
+
853
+- name: start a paused service check
854
+  win_service:
855
+    name: '{{test_win_service_name}}'
856
+    state: started
857
+  register: start_paused_service_check
858
+  check_mode: yes
859
+
860
+- name: assert start a paused service check
861
+  assert:
862
+    that:
863
+    - start_paused_service_check is changed
864
+    - start_paused_service_check.state == 'paused'
865
+
866
+- name: start a paused service
867
+  win_service:
868
+    name: '{{test_win_service_name}}'
869
+    state: started
870
+  register: start_paused_service
871
+
872
+- name: assert start a paused service
873
+  assert:
874
+    that:
875
+    - start_paused_service is changed
876
+    - start_paused_service.state == 'running'
877
+
878
+- name: pause service for next test
879
+  win_service:
880
+    name: '{{test_win_service_name}}'
881
+    state: paused
882
+
883
+- name: stop a paused service check
884
+  win_service:
885
+    name: '{{test_win_service_name}}'
886
+    state: stopped
887
+    force_dependent_services: True
888
+  register: stop_paused_service_check
889
+  check_mode: yes
890
+
891
+- name: assert stop a paused service check
892
+  assert:
893
+    that:
894
+    - stop_paused_service_check is changed
895
+    - stop_paused_service_check.state == 'paused'
896
+
897
+- name: stop a paused service
898
+  win_service:
899
+    name: '{{test_win_service_name}}'
900
+    state: stopped
901
+    force_dependent_services: True
902
+  register: stop_paused_service
903
+
904
+- name: assert stop a paused service
905
+  assert:
906
+    that:
907
+    - stop_paused_service is changed
908
+    - stop_paused_service.state == 'stopped'
909
+
910
+- name: fail to pause a stopped service check
911
+  win_service:
912
+    name: '{{test_win_service_name}}'
913
+    state: paused
914
+  register: fail_pause_stopped_service
915
+  failed_when: "fail_pause_stopped_service.msg != 'failed to pause service ' + test_win_service_name + ': The service does not support pausing'"