epc 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. data/CHANGELOG +1 -0
  2. data/Gemfile +22 -0
  3. data/Rakefile +67 -0
  4. data/Rakefile.gem +1 -0
  5. data/bin/epc +10 -0
  6. data/lib/epc.rb +126 -0
  7. data/lib/epc/client/base_client.rb +80 -0
  8. data/lib/epc/client/http_client.rb +19 -0
  9. data/lib/epc/client/json_client.rb +48 -0
  10. data/lib/epc/command/archive_project_command.rb +24 -0
  11. data/lib/epc/command/archive_solution_command.rb +21 -0
  12. data/lib/epc/command/attach_library_command.rb +82 -0
  13. data/lib/epc/command/attach_libraryset_command.rb +32 -0
  14. data/lib/epc/command/attach_runtime_command.rb +27 -0
  15. data/lib/epc/command/base_command.rb +451 -0
  16. data/lib/epc/command/bind_service_command.rb +35 -0
  17. data/lib/epc/command/build_command.rb +83 -0
  18. data/lib/epc/command/config/create_config_command.rb +55 -0
  19. data/lib/epc/command/copy_deployment_command.rb +21 -0
  20. data/lib/epc/command/create_command.rb +13 -0
  21. data/lib/epc/command/create_dependency_command.rb +43 -0
  22. data/lib/epc/command/define_service_command.rb +37 -0
  23. data/lib/epc/command/delete_config_command.rb +63 -0
  24. data/lib/epc/command/delete_dependency_command.rb +40 -0
  25. data/lib/epc/command/delete_group_command.rb +40 -0
  26. data/lib/epc/command/delete_library_command.rb +30 -0
  27. data/lib/epc/command/delete_librarylanguage_command.rb +40 -0
  28. data/lib/epc/command/delete_libraryset_command.rb +40 -0
  29. data/lib/epc/command/delete_project_command.rb +54 -0
  30. data/lib/epc/command/delete_role_command.rb +25 -0
  31. data/lib/epc/command/delete_serviceversion_command.rb +52 -0
  32. data/lib/epc/command/delete_solution_command.rb +39 -0
  33. data/lib/epc/command/delete_user_command.rb +31 -0
  34. data/lib/epc/command/deploy_command.rb +142 -0
  35. data/lib/epc/command/deployment/create_deployment_command.rb +82 -0
  36. data/lib/epc/command/detach_library_command.rb +35 -0
  37. data/lib/epc/command/detach_libraryset_command.rb +8 -0
  38. data/lib/epc/command/group/create_group_command.rb +21 -0
  39. data/lib/epc/command/info_command.rb +11 -0
  40. data/lib/epc/command/library/create_library_command.rb +45 -0
  41. data/lib/epc/command/librarylanguage/create_librarylanguage_command.rb +24 -0
  42. data/lib/epc/command/libraryset/create_libraryset_command.rb +54 -0
  43. data/lib/epc/command/list_approvals_command.rb +27 -0
  44. data/lib/epc/command/list_attachedlibraries_command.rb +42 -0
  45. data/lib/epc/command/list_boundservices_command.rb +40 -0
  46. data/lib/epc/command/list_config_command.rb +60 -0
  47. data/lib/epc/command/list_dependencies_command.rb +43 -0
  48. data/lib/epc/command/list_deployments_command.rb +68 -0
  49. data/lib/epc/command/list_groups_command.rb +19 -0
  50. data/lib/epc/command/list_libraries_command.rb +19 -0
  51. data/lib/epc/command/list_librarylanguages_command.rb +19 -0
  52. data/lib/epc/command/list_librarysets_command.rb +26 -0
  53. data/lib/epc/command/list_objectroles_command.rb +25 -0
  54. data/lib/epc/command/list_objecttypes_command.rb +20 -0
  55. data/lib/epc/command/list_permissiongroups_command.rb +20 -0
  56. data/lib/epc/command/list_projects_command.rb +36 -0
  57. data/lib/epc/command/list_projecttypes_command.rb +20 -0
  58. data/lib/epc/command/list_rolepermissions_command.rb +21 -0
  59. data/lib/epc/command/list_roles_command.rb +26 -0
  60. data/lib/epc/command/list_runtimes_command.rb +16 -0
  61. data/lib/epc/command/list_service_types_command.rb +19 -0
  62. data/lib/epc/command/list_servicedefinitions_command.rb +19 -0
  63. data/lib/epc/command/list_serviceversions_command.rb +21 -0
  64. data/lib/epc/command/list_solutions_command.rb +25 -0
  65. data/lib/epc/command/list_stages_command.rb +21 -0
  66. data/lib/epc/command/list_users_command.rb +26 -0
  67. data/lib/epc/command/list_versions_command.rb +39 -0
  68. data/lib/epc/command/login_command.rb +32 -0
  69. data/lib/epc/command/logout_command.rb +20 -0
  70. data/lib/epc/command/objectrole/create_objectrole_command.rb +19 -0
  71. data/lib/epc/command/project/create_project_command.rb +78 -0
  72. data/lib/epc/command/pull_command.rb +209 -0
  73. data/lib/epc/command/push_command.rb +194 -0
  74. data/lib/epc/command/refresh_solution_command.rb +71 -0
  75. data/lib/epc/command/renew_command.rb +19 -0
  76. data/lib/epc/command/request_passwordchange_command.rb +23 -0
  77. data/lib/epc/command/role/create_role_command.rb +17 -0
  78. data/lib/epc/command/serviceversion/create_serviceversion_command.rb +33 -0
  79. data/lib/epc/command/show_deployment_command.rb +57 -0
  80. data/lib/epc/command/show_group_command.rb +35 -0
  81. data/lib/epc/command/show_libraryset_command.rb +54 -0
  82. data/lib/epc/command/show_project_command.rb +74 -0
  83. data/lib/epc/command/show_projecttype_command.rb +18 -0
  84. data/lib/epc/command/show_role_command.rb +46 -0
  85. data/lib/epc/command/show_solution_command.rb +54 -0
  86. data/lib/epc/command/show_user_command.rb +42 -0
  87. data/lib/epc/command/solution/create_solution_command.rb +34 -0
  88. data/lib/epc/command/solution/list_solutions_command.rb +25 -0
  89. data/lib/epc/command/solution/update_solution_command.rb +43 -0
  90. data/lib/epc/command/submit_deployment_command.rb +19 -0
  91. data/lib/epc/command/target_command.rb +26 -0
  92. data/lib/epc/command/unarchive_project_command.rb +23 -0
  93. data/lib/epc/command/unarchive_solution_command.rb +21 -0
  94. data/lib/epc/command/unbind_service_command.rb +42 -0
  95. data/lib/epc/command/undefine_service_command.rb +33 -0
  96. data/lib/epc/command/undeploy_command.rb +106 -0
  97. data/lib/epc/command/update_config_command.rb +62 -0
  98. data/lib/epc/command/update_deploymentproject_command.rb +54 -0
  99. data/lib/epc/command/update_group_command.rb +43 -0
  100. data/lib/epc/command/update_librarylanguage_command.rb +28 -0
  101. data/lib/epc/command/update_libraryset_command.rb +80 -0
  102. data/lib/epc/command/update_project_command.rb +49 -0
  103. data/lib/epc/command/update_role_command.rb +47 -0
  104. data/lib/epc/command/update_rolepermissions_command.rb +83 -0
  105. data/lib/epc/command/update_solution_command.rb +45 -0
  106. data/lib/epc/command/update_user_command.rb +57 -0
  107. data/lib/epc/command/user/create_user_command.rb +27 -0
  108. data/lib/epc/command/vote_deployment_command.rb +29 -0
  109. data/lib/epc/config.rb +245 -0
  110. data/lib/epc/error/basic_error.rb +6 -0
  111. data/lib/epc/error/fatal_error.rb +6 -0
  112. data/lib/epc/error/input_error.rb +6 -0
  113. data/lib/epc/error/internal_error.rb +6 -0
  114. data/lib/epc/help.rb +292 -0
  115. data/lib/epc/persistent_attributes.rb +18 -0
  116. data/lib/epc/runner.rb +177 -0
  117. data/lib/epc/tabular_outputter.rb +161 -0
  118. data/lib/epc/version.rb +3 -0
  119. data/lib/fixnum.rb +9 -0
  120. data/lib/object.rb +13 -0
  121. data/test/command/archive_project_command_test.rb +41 -0
  122. data/test/command/archive_solution_command_test.rb +40 -0
  123. data/test/command/attach_library_command_test.rb +124 -0
  124. data/test/command/attach_libraryset_command_test.rb +49 -0
  125. data/test/command/attach_runtime_command_test.rb +44 -0
  126. data/test/command/base_command_test.rb +276 -0
  127. data/test/command/bind_service_command_test.rb +46 -0
  128. data/test/command/build_command_test.rb +103 -0
  129. data/test/command/copy_deployment_command_test.rb +38 -0
  130. data/test/command/create_config_command_test.rb +124 -0
  131. data/test/command/create_dependency_command_test.rb +55 -0
  132. data/test/command/create_deployment_command_test.rb +136 -0
  133. data/test/command/create_group_command_test.rb +34 -0
  134. data/test/command/create_library_command_test.rb +61 -0
  135. data/test/command/create_librarylanguage_command_test.rb +51 -0
  136. data/test/command/create_libraryset_command_test.rb +81 -0
  137. data/test/command/create_objectrole_command_test.rb +37 -0
  138. data/test/command/create_project_command_test.rb +102 -0
  139. data/test/command/create_role_command_test.rb +31 -0
  140. data/test/command/create_serviceversion_command_test.rb +60 -0
  141. data/test/command/create_solution_command_test.rb +70 -0
  142. data/test/command/create_user_command_test.rb +54 -0
  143. data/test/command/define_service_command_test.rb +55 -0
  144. data/test/command/delete_config_command_test.rb +82 -0
  145. data/test/command/delete_dependency_command_test.rb +50 -0
  146. data/test/command/delete_group_command_test.rb +56 -0
  147. data/test/command/delete_library_command_test.rb +43 -0
  148. data/test/command/delete_librarylanguage_command_test.rb +55 -0
  149. data/test/command/delete_libraryset_command_test.rb +55 -0
  150. data/test/command/delete_project_command_test.rb +76 -0
  151. data/test/command/delete_role_command_test.rb +41 -0
  152. data/test/command/delete_serviceversion_command_test.rb +53 -0
  153. data/test/command/delete_solution_command_test.rb +79 -0
  154. data/test/command/delete_user_command_test.rb +56 -0
  155. data/test/command/deploy_command_test.rb +185 -0
  156. data/test/command/detach_library_command_test.rb +53 -0
  157. data/test/command/info_command_test.rb +17 -0
  158. data/test/command/list_approvals_command_test.rb +41 -0
  159. data/test/command/list_boundservices_command_test.rb +46 -0
  160. data/test/command/list_config_command_test.rb +72 -0
  161. data/test/command/list_dependencies_command_test.rb +46 -0
  162. data/test/command/list_deployments_command_test.rb +112 -0
  163. data/test/command/list_deploymentstages_command_test.rb +44 -0
  164. data/test/command/list_libraries_command_test.rb +42 -0
  165. data/test/command/list_librarylanguages_command_test.rb +34 -0
  166. data/test/command/list_librarysets_command_test.rb +33 -0
  167. data/test/command/list_objectroles_command_test.rb +41 -0
  168. data/test/command/list_objecttypes_command_test.rb +25 -0
  169. data/test/command/list_permissiongroups_command_test.rb +25 -0
  170. data/test/command/list_projects_command_test.rb +63 -0
  171. data/test/command/list_projecttypes_command_test.rb +39 -0
  172. data/test/command/list_rolepermissions_command_test.rb +39 -0
  173. data/test/command/list_roles_command_test.rb +46 -0
  174. data/test/command/list_runtimes_command_test.rb +30 -0
  175. data/test/command/list_service_types_command_test.rb +44 -0
  176. data/test/command/list_servicedefinitions_command_test.rb +44 -0
  177. data/test/command/list_serviceversions_command_test.rb +47 -0
  178. data/test/command/list_solutions_command_test.rb +48 -0
  179. data/test/command/list_users_command_test.rb +33 -0
  180. data/test/command/login_command_test.rb +83 -0
  181. data/test/command/logout_command_test.rb +30 -0
  182. data/test/command/pull_command_test.rb +229 -0
  183. data/test/command/push_command_test.rb +246 -0
  184. data/test/command/refresh_solution_command_test.rb +35 -0
  185. data/test/command/renew_command_test.rb +43 -0
  186. data/test/command/request_passwordchange_command_test.rb +31 -0
  187. data/test/command/show_group_command_test.rb +50 -0
  188. data/test/command/show_libraryset_command_test.rb +51 -0
  189. data/test/command/show_project_command_test.rb +57 -0
  190. data/test/command/show_projecttype_command_test.rb +46 -0
  191. data/test/command/show_role_command_test.rb +37 -0
  192. data/test/command/show_solution_command_test.rb +59 -0
  193. data/test/command/show_user_command_test.rb +50 -0
  194. data/test/command/submit_deployment_command_test.rb +37 -0
  195. data/test/command/target_command_test.rb +58 -0
  196. data/test/command/unarchive_project_command_test.rb +45 -0
  197. data/test/command/unarchive_solution_command_test.rb +43 -0
  198. data/test/command/unbind_service_command_test.rb +48 -0
  199. data/test/command/undefine_service_command_test.rb +49 -0
  200. data/test/command/update_config_command_test.rb +74 -0
  201. data/test/command/update_deploymentproject_command_test.rb +77 -0
  202. data/test/command/update_group_command_test.rb +69 -0
  203. data/test/command/update_librarylanguage_command_test.rb +43 -0
  204. data/test/command/update_libraryset_command_test.rb +113 -0
  205. data/test/command/update_project_command_test.rb +56 -0
  206. data/test/command/update_role_command_test.rb +42 -0
  207. data/test/command/update_rolepermissions_command_test.rb +54 -0
  208. data/test/command/update_solution_command_test.rb +58 -0
  209. data/test/command/update_user_command_test.rb +76 -0
  210. data/test/command/vote_deployment_command_test.rb +33 -0
  211. data/test/config_test.rb +70 -0
  212. data/test/successful_test.rb +21 -0
  213. data/test/test_files/pom.xml +273 -0
  214. data/test/test_helper.rb +25 -0
  215. metadata +470 -0
@@ -0,0 +1,40 @@
1
+ module EPC::Command
2
+ class DeleteLibrarylanguageCommand < BaseCommand
3
+
4
+ def execute(language = nil)
5
+ if language.nil?
6
+ say("You need to specify a language id/name")
7
+ say(EPC::Help::COMMAND_USAGES[:delete_librarylanguage])
8
+ return 1
9
+ end
10
+
11
+ proceed = ask_yn("Are you sure you want to delete the [#{language}] language? [Yn] ")
12
+ if proceed.upcase == "N"
13
+ return 1
14
+ end
15
+
16
+
17
+ if numeric?(language)
18
+ language_id = language.to_i
19
+ else
20
+ language_id = get_resource_id(EPC::Config::LIBRARY_LANGUAGES_PATH, :name, language)
21
+ end
22
+
23
+ if language_id.nil?
24
+ say("Language could not be determined")
25
+ return 1
26
+ end
27
+
28
+ status, response, headers = client.delete(EPC::Config::LIBRARY_LANGUAGES_PATH + "/#{language_id}")
29
+
30
+ if status.successful?
31
+ say("Language deleted")
32
+ else
33
+ say("Request failed: [#{response[:message]}]")
34
+ end
35
+
36
+ return status
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ module EPC::Command
2
+ class DeleteLibrarysetCommand < BaseCommand
3
+
4
+ def execute(set = nil)
5
+ if set.nil?
6
+ say("You need to specify a set id/name")
7
+ say(EPC::Help::COMMAND_USAGES[:delete_libraryset])
8
+ return 1
9
+ end
10
+
11
+ proceed = ask_yn("Are you sure you want to delete the [#{set}] set? [Yn] ")
12
+ if proceed.upcase == "N"
13
+ return 1
14
+ end
15
+
16
+
17
+ if numeric?(set)
18
+ set_id = set.to_i
19
+ else
20
+ set_id = get_resource_id(EPC::Config::LIBRARY_SETS_PATH, :name, set)
21
+ end
22
+
23
+ if set_id.nil?
24
+ say("Set could not be determined")
25
+ return 1
26
+ end
27
+
28
+ status, response, headers = client.delete(EPC::Config::LIBRARY_SETS_PATH + "/#{set_id}")
29
+
30
+ if status.successful?
31
+ say("Set deleted")
32
+ else
33
+ say("Request failed: [#{response[:message]}]")
34
+ end
35
+
36
+ return status
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,54 @@
1
+ module EPC::Command
2
+ class DeleteProjectCommand < BaseCommand
3
+ def execute(project_name = nil)
4
+ path = "."
5
+ path = File.expand_path(path)
6
+
7
+ solution_name = @options[:solution_name]
8
+
9
+ solution_id, solution_name = infer_solution_context(solution_name, path, :get_solution_name => true)
10
+ project_id, project_name = infer_project_context(project_name, path, solution_id, {:get_project_name => true})
11
+
12
+ if project_id.nil?
13
+ say("Project name could not be inferred")
14
+ say(EPC::Help::COMMAND_USAGES[:delete_project])
15
+ return 1
16
+ end
17
+
18
+ question = "You are deleting the project [#{project_id}"
19
+ if project_name.nil?
20
+ question += "] Correct? [Yn] "
21
+ else
22
+ question += " - #{project_name}].Correct? [Yn] "
23
+ end
24
+
25
+ unless @options[:force]
26
+ proceed = ask_yn(question)
27
+ if proceed.upcase == 'N'
28
+ return 1
29
+ end
30
+ end
31
+
32
+ status, response, message = client.delete(EPC::Config::PROJECTS_PATH + "/#{project_id}")
33
+ if status.successful?
34
+ remove_project_metadata(path, project_name) if EPC::Config.is_project_dir?(path) || EPC::Config.is_solution_dir?(path)
35
+ say("Project deleted.")
36
+ else
37
+ say("Project could not be deleted. Delete failed with: [#{response[:message]}]")
38
+ end
39
+ return status
40
+
41
+ end
42
+
43
+ private
44
+
45
+ def remove_project_metadata(path, project_name)
46
+ if EPC::Config.is_solution_dir?(path)
47
+ metadata_file = File.join( path, project_name, ".epc_project")
48
+ else
49
+ metadata_file = File.join(path, ".epc_project")
50
+ end
51
+ File.delete(metadata_file) if FileTest.exist?(metadata_file)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,25 @@
1
+ module EPC::Command
2
+ class DeleteRoleCommand < BaseCommand
3
+ required_arguments_count 1, :message => "You must specify the role id/name"
4
+
5
+ def execute(role = nil)
6
+
7
+ proceed = ask_yn("Are you sure you want to delete the [#{role}] role? [Yn] ")
8
+ if proceed.upcase == "N"
9
+ return 1
10
+ end
11
+
12
+ role_id = retrieve_system_role_identifier(role)
13
+
14
+ status, response, headers = client.delete(EPC::Config::ROLES_PATH + "/#{role_id}/system/true")
15
+
16
+ if status.successful?
17
+ say("Role deleted")
18
+ else
19
+ say("Request failed: [#{response[:message]}]")
20
+ end
21
+
22
+ return status
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,52 @@
1
+ module EPC::Command
2
+ class DeleteServiceversionCommand < BaseCommand
3
+
4
+ def execute(service_version = nil, definition_name = nil)
5
+ if service_version.nil?
6
+ say("You must specify a service version identifier")
7
+ say(EPC::Help::COMMAND_USAGES[:delete_serviceversion])
8
+ return 1
9
+ end
10
+
11
+ proceed = ask_yn("Are you sure you want to delete the [#{service_version}] service_version. Correct? [Yn] ")
12
+ if proceed.upcase == 'N'
13
+ return 1
14
+ end
15
+
16
+ if numeric?(service_version)
17
+ service_version_id = service_version.to_i
18
+ else
19
+ if definition_name.nil?
20
+ say("You must specify the definition name")
21
+ say(EPC::Help::COMMAND_USAGES[:delete_serviceversion])
22
+ return 1
23
+ end
24
+
25
+
26
+ status, response, headers = client.get(EPC::Config::SERVICE_VERSIONS_PATH)
27
+
28
+ if numeric?(definition_name)
29
+ service_version_id = response.detect{|version| version[:label] == service_version && version[:service_definition_id] == definition_name.to_i }[:id] rescue nil
30
+ else
31
+ service_version_id = response.detect{|version| version[:label] == service_version && version[:service_definition_name] == definition_name }[:id] rescue nil
32
+ end
33
+
34
+ end
35
+
36
+ if service_version_id.nil? || service_version_id == 0
37
+ say("Service version not found.")
38
+ return 1
39
+ end
40
+
41
+ status, response, headers = client.delete(EPC::Config::SERVICE_VERSIONS_PATH + "/#{service_version_id}")
42
+
43
+ if status.successful?
44
+ say("Service version deleted.")
45
+ else
46
+ say("Request failed: [#{response[:message]}]")
47
+ end
48
+ return status
49
+
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,39 @@
1
+ module EPC::Command
2
+ class DeleteSolutionCommand < BaseCommand
3
+ def execute(solution_name = nil)
4
+ path = "."
5
+ path = File.expand_path(path)
6
+
7
+
8
+ solution_id, solution_name = infer_solution_context(solution_name, path, :get_solution_name => true)
9
+
10
+ if solution_id.nil?
11
+ say("Solution could not be inferred")
12
+ return 1
13
+ end
14
+
15
+ proceed = ask_yn("Are you sure you want to delete [#{solution_id} - #{solution_name}]. Correct? [Yn] ")
16
+ if proceed.upcase == 'N'
17
+ return 1
18
+ end
19
+
20
+ status, response, message = client.delete(EPC::Config::SOLUTIONS_PATH + "/#{solution_id}")
21
+ if status.successful?
22
+ remove_solution_metadata(project_solution_path(path)) if EPC::Config.is_solution_dir?(path) || EPC::Config.is_project_dir?(path)
23
+ say("Solution deleted.")
24
+ else
25
+ say("Solution could not be deleted. Delete failed with: [#{response[:message]}]")
26
+ end
27
+ return status
28
+ end
29
+
30
+ def remove_solution_metadata(solution_path)
31
+ dirs = Dir.glob(solution_path + "/**/")
32
+ dirs.each do |dir|
33
+ file = dir + "/.epc_project"
34
+ File.delete(file) if FileTest.exist?(file)
35
+ end
36
+ File.delete(solution_path + "/.epc_solution") if FileTest.exist?(solution_path + "/.epc_solution")
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,31 @@
1
+ module EPC::Command
2
+ class DeleteUserCommand < BaseCommand
3
+ def execute(user = nil)
4
+
5
+ raise FatalError, "You need to specify a user id/email" if user.nil?
6
+
7
+ proceed = ask_yn("Are you sure you want to delete the [#{user}] user? [Yn] ")
8
+ if proceed.upcase == "N"
9
+ return 1
10
+ end
11
+
12
+ if numeric?(user)
13
+ user_id = user.to_i
14
+ else
15
+ user_id = get_resource_id(EPC::Config::USERS_PATH, :email, user)
16
+ end
17
+
18
+ raise FatalError, "User could not be determined" if user_id.blank? || user_id == 0
19
+
20
+ status, response, headers = client.delete(EPC::Config::USERS_PATH + "/#{user_id}")
21
+
22
+ if status == 200
23
+ say("User deleted")
24
+ else
25
+ say("Request failed: [#{response[:message]}]")
26
+ end
27
+
28
+ return status
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,142 @@
1
+ module EPC::Command
2
+ class DeployCommand < BaseCommand
3
+ SLEEP_TIME = 1
4
+
5
+ # Numerators are in secs
6
+ TICKER_TICKS = 25/SLEEP_TIME
7
+ GIVEUP_TICKS = 120/SLEEP_TIME
8
+
9
+ def execute(stage = nil)
10
+ path = "."
11
+ path = File.expand_path(path)
12
+
13
+ if !( EPC::Config.is_solution_dir?(path) || EPC::Config.is_project_dir?(path)) && @options[:deployment_id].nil?
14
+ say("This is not a solution directory.")
15
+ return 1
16
+ end
17
+
18
+ if @options[:no_poll].present? && @options[:timeout].present?
19
+ raise InputError, "You cannot specify both --nopoll and --timeout options at the same time"
20
+ end
21
+
22
+ @timeout = GIVEUP_TICKS
23
+
24
+ solution_id, solution_name = infer_solution_context(nil, path)
25
+
26
+
27
+ if @options[:deployment_id].nil?
28
+ proceed = ask_yn("You are deploying the [#{solution_name}] solution. Correct? [Yn]: ")
29
+ return 1 if proceed.upcase == 'N'
30
+ end
31
+
32
+ if @options[:use_local].present? && @options[:use_local]
33
+ @options[:skip_build] = true
34
+ result, versions = EPC::Command::PushCommand.new(client, @options).execute_internal
35
+ return result if result != 0
36
+ b_versions = (versions.map{|v| "#{v.keys.first}=#{v.values.first}"})
37
+ result = EPC::Command::BuildCommand.new(client, @options).execute(*b_versions)
38
+ return result unless result.successful? || result == 0
39
+ end
40
+
41
+ deployment_id = @options[:deployment_id]
42
+
43
+ deployment_id = create_deployment(solution_name, stage) if stage.present?
44
+ deployment_id = create_deployment(solution_name, stage) if deployment_id.nil?
45
+
46
+ raise FatalError, "Could not find/create deployment id." if deployment_id.nil? || deployment_id == -1
47
+
48
+ parse_timeout_value
49
+
50
+ begin
51
+ say("Deploying #{deployment_id}")
52
+ status, response = deploy(deployment_id)
53
+ if @options[:no_poll].present?
54
+ say("Request submitted")
55
+ return status
56
+ end
57
+ say("Deploying - ")
58
+ shown, deployment_status = poll_for_deployment_statuses(deployment_id)
59
+ if shown
60
+ display_statuses(deployment_status, response[:deployed_projects])
61
+ end
62
+ rescue Exception => ex
63
+ say("Deploy failed [#{ex.to_s}].")
64
+ return 1
65
+ end
66
+ return status
67
+ end
68
+
69
+ private
70
+
71
+ def create_deployment(solution_name, stage_name = nil)
72
+ command = EPC::Command::CreateDeploymentCommand.new(client, {:solution_name => solution_name, :skip_prompts => @options[:skip_prompts]})
73
+ deployment_id = command.execute_internal(stage_name)
74
+ return deployment_id
75
+ end
76
+
77
+ def deploy(id)
78
+ status, response, headers = client.put("#{EPC::Config::DEPLOYMENTS_PATH}/#{id}/deploy")
79
+ if status.successful?
80
+ return status, response
81
+ else
82
+ raise response[:message]
83
+ end
84
+ end
85
+
86
+ def show_deployment(id)
87
+ status, response, headers = client.get("#{EPC::Config::DEPLOYMENTS_PATH}/#{id}/status")
88
+ if status.successful?
89
+ return status, nil, response[:status]
90
+ else
91
+ return status, response, nil
92
+ end
93
+ end
94
+
95
+ def poll_for_deployment_statuses(id)
96
+ @timeout = GIVEUP_TICKS if @timeout.blank?
97
+ count = 0
98
+ failed = false
99
+
100
+ while count <= @timeout
101
+ # unless count > TICKER_TICKS
102
+ STDOUT.print('.')
103
+ STDOUT.flush
104
+ # end
105
+ sleep(SLEEP_TIME)
106
+
107
+ status, code, deployment_status = show_deployment(id)
108
+ if status.successful? || (deployment_status == 404 && code == 901)
109
+ count += 1
110
+ next unless deployment_status == "STARTED" || deployment_status == "STOPPED" || deployment_status == "UNDEPLOYED" || deployment_status == "ERROR"
111
+ break
112
+ else
113
+ say("Poller failure [HTTP Error(#{status}): API error code (#{code})]")
114
+ say("Poller failed to get the deployment statuses. Aborting.")
115
+ failed = true
116
+ break
117
+ end
118
+ end
119
+
120
+ if deployment_status && deployment_status.present?
121
+ [true, deployment_status]
122
+ elsif failed
123
+ [false, nil]
124
+ else
125
+ if count > @timeout
126
+ say("\nServer is taking too long to update the deployment statuses. Please contact the AgileMethods support team.")
127
+ end
128
+ [false, nil]
129
+ end
130
+ end
131
+
132
+ def display_statuses(deployment_status, deployed_projects)
133
+ say("\nStatus = #{deployment_status}\n")
134
+ deployed_projects.each do |project|
135
+ say("#{project[:project_name]} -> #{project[:uris].join(",")}\n")
136
+ end
137
+
138
+ end
139
+
140
+
141
+ end
142
+ end
@@ -0,0 +1,82 @@
1
+ module EPC::Command
2
+ class CreateDeploymentCommand < BaseCommand
3
+ def execute(*params)
4
+
5
+ target_type, target_id = params[0].split(":") rescue [nil, nil]
6
+ stage_name = params[1]
7
+
8
+ path = File.expand_path(".")
9
+
10
+ stage_name = "Development" if stage_name.nil?
11
+ solution_name = @options[:solution_name]
12
+
13
+ solution_id, solution_name = infer_solution_context(target_id, path, {:get_solution_name => true})
14
+
15
+ raise FatalError, "Solution name could not be inferred from directory structure. Either run this command from a solution directory, or specify the solution name with the -s option." if solution_name.nil?
16
+
17
+ proceed = ask_yn("You are creating a deployment for the [#{solution_name}] solution with the [#{stage_name}] stage. Correct? [Yn]: ")
18
+ if proceed.upcase == 'N'
19
+ return 1
20
+ end
21
+
22
+ versions, instances = {}, {}
23
+ versions, instances = parse_projects(@options[:project_name]) unless blank?(@options[:project_name])
24
+
25
+ begin
26
+ status, @id = create_deployment(solution_name, stage_name, versions, instances)
27
+ return status unless status.successful?
28
+ rescue Exception => ex
29
+ say("Create deployment failed [Exception Caught (#{ex.class.name}): #{ex.to_s}].")
30
+ return 1
31
+ end
32
+
33
+
34
+ if @options[:replaces].present?
35
+ status, response, headers = client.put(EPC::Config::DEPLOYMENTS_PATH + "/#{@id}", {:stage_name => "no_change", :replaces_id => @options[:replaces], :versions => "no_change"})
36
+ if status.failure?
37
+ say("Replacement request failed: [#{response[:message]}]")
38
+ else
39
+ say("Replacement request successful")
40
+ end
41
+ return status
42
+ end
43
+
44
+ end
45
+
46
+ def execute_internal(stage_name = nil)
47
+ execute(stage_name)
48
+ return @id
49
+ end
50
+
51
+ private
52
+
53
+ def create_deployment(solution_name, stage_name, versions = nil, instances = nil)
54
+ params = {:solution_name => solution_name, :stage_name => stage_name}
55
+ params[:versions] = versions unless blank?(versions)
56
+ params[:instances] = instances unless blank?(instances)
57
+ status, response, headers = client.post("#{EPC::Config::DEPLOYMENTS_PATH}", params)
58
+ if status.successful?
59
+ say("Successfully created deployment [#{response[:id]}] with [#{target_url}]")
60
+ return status, response[:id]
61
+ else
62
+ say("Deployment creation failed [#{response[:message]}]. Aborting.")
63
+ return status, nil
64
+ end
65
+ end
66
+
67
+ def parse_projects(data)
68
+ return [], [] if data.blank?
69
+ versions = []
70
+ instances = []
71
+ projects_data = data.split("|")
72
+ projects_data.each do |project_data|
73
+ project_id, ver, inst = project_data.split(":")
74
+ next if blank?(project_id)
75
+ versions << {:project_id => project_id, :version => ver} unless blank?(ver)
76
+ instances << {:project_id => project_id, :instances => inst} unless blank?(inst)
77
+ end
78
+
79
+ return versions, instances
80
+ end
81
+ end
82
+ end