(cherry picked from commit 2e99dea8677e2e8fbd9534f6473e65ecacb72896)
Jordan Borean authored on 2019/02/04 19:29:29... | ... |
@@ -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'" |