Skip to content
This repository was archived by the owner on Sep 16, 2024. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
adb57d8
Update README.md
rjrudin Oct 12, 2015
5c4f7ed
#62 Deploying amps after modules database created
rjrudin Oct 14, 2015
ce8dc3f
Fix ml-init for null case, and chmod gradlew
Oct 14, 2015
f3b3411
Merge pull request #63 from grechaw/fix-ml-init
rjrudin Oct 15, 2015
e3eb9cd
#61 Can now create replicas for a given database
rjrudin Oct 16, 2015
c5afcbe
#61 Now deleting replicas based on a database name
rjrudin Oct 16, 2015
06c30e2
#61 Small tweak to make sure no work is done if the maps are empty
rjrudin Oct 16, 2015
7b11ac3
#61 Allow for database names and replica counts to be set as a comma-…
rjrudin Oct 21, 2015
7114500
Updated changelog
rjrudin Oct 26, 2015
5370450
Added convenience constructor for DeployDatabaseCommand
rjrudin Oct 26, 2015
277c836
Added SetSslFipsEnabledCommand
rjrudin Nov 27, 2015
1b4584f
Merge remote-tracking branch 'origin/master' into dev
rjrudin Nov 27, 2015
4f8558e
#67 Now supporting triggers
rjrudin Nov 27, 2015
beff0cf
Updated changelog
rjrudin Nov 27, 2015
e1c8ee9
Finish issue-68
rjrudin Nov 30, 2015
e928c0e
#68 Slight modification to avoid any chance of an infinite loop
rjrudin Nov 30, 2015
9f148a5
#68 Ack, need alerts to be after CPF
rjrudin Dec 1, 2015
d274daa
Can now delete all scheduled tasks easily
rjrudin Dec 5, 2015
bfe670f
Can now delete all flexrep configs
rjrudin Dec 5, 2015
303cb50
Can now delete all alert configs
rjrudin Dec 5, 2015
02269a7
Logging an error when unable to clear a database
rjrudin Dec 6, 2015
c123539
Logging user and path on all requests
rjrudin Dec 6, 2015
fc450c3
Added buildFromSystemProps to ManageConfig
rjrudin Dec 7, 2015
e690499
#69 Added test to confirm that setting modulesDatabaseName should work
rjrudin Dec 9, 2015
5ac6df1
Merge branch 'dev'
rjrudin Dec 9, 2015
3f84af1
Added methods for enabling/disabling flexrep targets
rjrudin Dec 9, 2015
f1c5a31
Merge branch 'master' into dev
rjrudin Dec 9, 2015
8ea4f9b
More disable/enable methods for TargetManager
rjrudin Dec 9, 2015
c5ee867
Removing OBE command
rjrudin Dec 10, 2015
5688475
Added property to LoadModulesCommand for specifying more binary exten…
rjrudin Dec 10, 2015
522b72a
Added disableAll/enableAll to ConfigManager
rjrudin Dec 10, 2015
1f4f30f
Allowing for DocumentFormatGetter to be overridden
rjrudin Dec 10, 2015
3f60637
Don't need to override this now that group-id is part of the resource…
rjrudin Dec 13, 2015
1561e27
Finish ml-objects
rjrudin Dec 13, 2015
481e299
Finish resource-api
rjrudin Dec 17, 2015
d118c4f
#72 Fixing issue where "is deleted" wasn't saved in the DeleteReceipt…
rjrudin Dec 20, 2015
abde0c6
#72 Updated changelog
rjrudin Dec 20, 2015
697e22b
Reworking how mlModulePermissions is processed
rjrudin Dec 20, 2015
9a99972
Finish api-sandbox
rjrudin Dec 23, 2015
857c4b6
Updated imports
rjrudin Dec 23, 2015
6f85e1d
Repackaged to com.marklogic
rjrudin Dec 23, 2015
92f6d99
Added a limit for # of retries
rjrudin Dec 23, 2015
616e03b
#73 Added support for a FileFilter on AppConfig
rjrudin Dec 27, 2015
8f27bc1
Throwing in a few defaults on AppConfig
rjrudin Dec 29, 2015
21f53d7
Added bintray support
rjrudin Dec 29, 2015
817ee1e
Added sourcesJar
rjrudin Jan 1, 2016
c33061f
Only needs jcenter now
rjrudin Jan 1, 2016
f10db5e
Adding rjrudin bintray back for now
rjrudin Jan 1, 2016
2bcc93d
Only needs jcenter now
rjrudin Jan 3, 2016
6163b7c
Changing logging from warn to info
rjrudin Jan 4, 2016
2936107
Now using 2.5 of ml-javaclient-util and ml-junit
rjrudin Jan 4, 2016
a6809fb
Only need jcenter
rjrudin Jan 5, 2016
3572c4e
#74 New command for verifying server version
rjrudin Jan 6, 2016
8c4a23e
Starting 2.0rc3 changelog
rjrudin Jan 6, 2016
fbc4c6e
#75 Finish mimetypes
rjrudin Jan 17, 2016
605e13e
Updated changelog
rjrudin Jan 17, 2016
9d9a747
#77 Now supports properties starting with "marklogic."
rjrudin Jan 18, 2016
732f71c
#78 Fixed issue with mlContentForestsPerHost not being supported
rjrudin Jan 19, 2016
aa7af90
Update README.md
rjrudin Jan 19, 2016
551ce51
Added test for deleting multiple "other" servers at once, and added e…
rjrudin Jan 20, 2016
f3c2d1b
Updating changelog for 2.0rc4
rjrudin Jan 20, 2016
e1988a2
Updated license
rjrudin Jan 31, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion CHANGELOG.mdown
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@
* Added SetSslFipsEnabledCommand
* [#67](https://github.com/rjrudin/ml-app-deployer/issues/67) Now supporting triggers (requires ML 8.0-4)
* [#68](https://github.com/rjrudin/ml-app-deployer/issues/68) Now supporting alert configs, actions, and rules (requires ML 8.0-4)

* Can delete all scheduled tasks with TaskManager
* Can delete all flexrep configs with ConfigManager
* Can delete all alert configs with AlertConfigManager

## 2.0b12

* Added null-check in SimpleAppDeployer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,6 @@ public abstract class SortOrderConstants {
public static Integer DEPLOY_AMPS = 450;

public static Integer DEPLOY_TRIGGERS = 700;
public static Integer DEPLOY_ALERT_CONFIGS = 710;
public static Integer DEPLOY_ALERT_ACTIONS = 720;
public static Integer DEPLOY_ALERT_RULES = 730;

public static Integer DEPLOY_SCHEDULED_TASKS = 800;

Expand All @@ -42,6 +39,10 @@ public abstract class SortOrderConstants {
public static Integer DEPLOY_DOMAINS = 910;
public static Integer DEPLOY_CPF_CONFIGS = 920;

public static Integer DEPLOY_ALERT_CONFIGS = 950;
public static Integer DEPLOY_ALERT_ACTIONS = 960;
public static Integer DEPLOY_ALERT_RULES = 970;

public static Integer DEPLOY_FLEXREP_CONFIGS = 1000;
public static Integer DEPLOY_FLEXREP_TARGETS = 1010;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,18 +51,17 @@ public Fragment getPropertiesAsXml(String resourceNameOrId) {
.getXml(getPropertiesPath(resourceNameOrId));
}

/**
* Determines whether to create a new resource or update an existing one based on the contents of the payload.
*/
public SaveReceipt save(String payload) {
String resourceId = getResourceId(payload);
String label = getResourceName();
String path = null;
ResponseEntity<String> response = null;
if (exists(resourceId)) {
if (updateAllowed) {
path = getPropertiesPath(resourceId);
path = appendParamsAndValuesToPath(path, getUpdateResourceParams(payload));
logger.info(format("Found %s with name of %s, so updating at path %s", label, resourceId, path));
response = putPayload(manageClient, path, payload);
logger.info(format("Updated %s at %s", label, path));
return updateResource(payload, resourceId);
} else {
logger.info("Resource already exists and updates are not supported, so not updating: " + resourceId);
}
Expand All @@ -75,6 +74,24 @@ public SaveReceipt save(String payload) {
return new SaveReceipt(resourceId, payload, path, response);
}

/**
* Most clients should just use the save method, but this is public for scenarios where a client knows an update
* should be performed.
*
* @param payload
* @param resourceId
* @return
*/
public SaveReceipt updateResource(String payload, String resourceId) {
String path = getPropertiesPath(resourceId);
String label = getResourceName();
path = appendParamsAndValuesToPath(path, getUpdateResourceParams(payload));
logger.info(format("Found %s with name of %s, so updating at path %s", label, resourceId, path));
ResponseEntity<String> response = putPayload(manageClient, path, payload);
logger.info(format("Updated %s at %s", label, path));
return new SaveReceipt(resourceId, payload, path, response);
}

protected String getCreateResourcePath(String payload) {
return getResourcesPath();
}
Expand All @@ -87,25 +104,28 @@ public boolean deleteByIdField(String resourceIdFieldValue) {

public boolean delete(String payload) {
String resourceId = getResourceId(payload);
String label = getResourceName();
if (!exists(resourceId)) {
logger.info(format("Could not find %s with name or ID of %s, so not deleting", label, resourceId));
logger.info(format("Could not find %s with name or ID of %s, so not deleting", getResourceName(), resourceId));
return false;
} else {
String path = getResourcePath(resourceId);
path = appendParamsAndValuesToPath(path, getDeleteResourceParams(payload));

logger.info(format("Deleting %s at path %s", label, path));
if (useAdminUser()) {
manageClient.deleteAsAdmin(path);
} else {
manageClient.delete(path);
}
logger.info(format("Deleted %s at path %s", label, path));
deleteAtPath(path);
return true;
}
}

public void deleteAtPath(String path) {
String label = getResourceName();
logger.info(format("Deleting %s at path %s", label, path));
if (useAdminUser()) {
manageClient.deleteAsAdmin(path);
} else {
manageClient.delete(path);
}
logger.info(format("Deleted %s at path %s", label, path));
}

protected String appendParamsAndValuesToPath(String path, String... paramsAndValues) {
if (paramsAndValues.length > 0) {
path += "?";
Expand Down
69 changes: 39 additions & 30 deletions src/main/java/com/rjrudin/marklogic/mgmt/ManageClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,62 +63,47 @@ public void initialize(ManageConfig config) {
}

public ResponseEntity<String> putJson(String path, String json) {
logRequest(path, "JSON", "PUT");
return restTemplate.exchange(baseUrl + path, HttpMethod.PUT, buildJsonEntity(json), String.class);
}

public ResponseEntity<String> putJsonAsAdmin(String path, String json) {
if (logger.isDebugEnabled()) {
logger.debug("Sending JSON PUT request as user with MarkLogic admin role");
}
logAdminRequest(path, "JSON", "PUT");
return adminRestTemplate.exchange(baseUrl + path, HttpMethod.PUT, buildJsonEntity(json), String.class);
}

public ResponseEntity<String> putXml(String path, String xml) {
logRequest(path, "XML", "PUT");
return restTemplate.exchange(baseUrl + path, HttpMethod.PUT, buildXmlEntity(xml), String.class);
}

public ResponseEntity<String> putXmlAsAdmin(String path, String xml) {
if (logger.isDebugEnabled()) {
logger.debug("Sending XML PUT request as user with MarkLogic admin role");
}
logAdminRequest(path, "XML", "PUT");
return adminRestTemplate.exchange(baseUrl + path, HttpMethod.PUT, buildXmlEntity(xml), String.class);
}

public ResponseEntity<String> postJson(String path, String json) {
logRequest(path, "JSON", "POST");
return restTemplate.exchange(baseUrl + path, HttpMethod.POST, buildJsonEntity(json), String.class);
}

public ResponseEntity<String> postJsonAsAdmin(String path, String json) {
if (logger.isDebugEnabled()) {
logger.debug("Sending JSON POST request as user with MarkLogic admin role");
}
logAdminRequest(path, "JSON", "POST");
return adminRestTemplate.exchange(baseUrl + path, HttpMethod.POST, buildJsonEntity(json), String.class);
}

public ResponseEntity<String> postXml(String path, String xml) {
logRequest(path, "XML", "POST");
return restTemplate.exchange(baseUrl + path, HttpMethod.POST, buildXmlEntity(xml), String.class);
}

public ResponseEntity<String> postXmlAsAdmin(String path, String xml) {
if (logger.isDebugEnabled()) {
logger.debug("Sending XML POST request as user with MarkLogic admin role");
}
logAdminRequest(path, "XML", "POST");
return adminRestTemplate.exchange(baseUrl + path, HttpMethod.POST, buildXmlEntity(xml), String.class);
}

public HttpEntity<String> buildJsonEntity(String json) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return new HttpEntity<String>(json, headers);
}

public HttpEntity<String> buildXmlEntity(String xml) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_XML);
return new HttpEntity<String>(xml, headers);
}

public ResponseEntity<String> postForm(String path, String... params) {
logRequest(path, "form", "POST");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
Expand All @@ -130,6 +115,7 @@ public ResponseEntity<String> postForm(String path, String... params) {
}

public Fragment getXml(String path, String... namespacePrefixesAndUris) {
logRequest(path, "XML", "GET");
String xml = getRestTemplate().getForObject(getBaseUrl() + path, String.class);
List<Namespace> list = new ArrayList<Namespace>();
for (int i = 0; i < namespacePrefixesAndUris.length; i += 2) {
Expand All @@ -139,9 +125,7 @@ public Fragment getXml(String path, String... namespacePrefixesAndUris) {
}

public Fragment getXmlAsAdmin(String path, String... namespacePrefixesAndUris) {
if (logger.isDebugEnabled()) {
logger.debug("Sending GET request as user with MarkLogic admin role");
}
logAdminRequest(path, "XML", "GET");
String xml = getAdminRestTemplate().getForObject(getBaseUrl() + path, String.class);
List<Namespace> list = new ArrayList<Namespace>();
for (int i = 0; i < namespacePrefixesAndUris.length; i += 2) {
Expand All @@ -151,16 +135,41 @@ public Fragment getXmlAsAdmin(String path, String... namespacePrefixesAndUris) {
}

public void delete(String path) {
logRequest(path, "", "DELETE");
restTemplate.delete(baseUrl + path);
}

public void deleteAsAdmin(String path) {
if (logger.isDebugEnabled()) {
logger.debug("Sending DELETE request as user with MarkLogic admin role");
}
logAdminRequest(path, "", "DELETE");
adminRestTemplate.delete(baseUrl + path);
}

public HttpEntity<String> buildJsonEntity(String json) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return new HttpEntity<String>(json, headers);
}

public HttpEntity<String> buildXmlEntity(String xml) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_XML);
return new HttpEntity<String>(xml, headers);
}

protected void logRequest(String path, String contentType, String method) {
if (logger.isInfoEnabled()) {
logger.info(String.format("Sending %s %s request as user '%s' to path: %s", contentType, method,
manageConfig.getUsername(), path));
}
}

protected void logAdminRequest(String path, String contentType, String method) {
if (logger.isInfoEnabled()) {
logger.info(String.format("Sending %s %s request as user with admin role '%s' to path: %s", contentType,
method, manageConfig.getUsername(), path));
}
}

public RestTemplate getRestTemplate() {
return restTemplate;
}
Expand Down
36 changes: 36 additions & 0 deletions src/main/java/com/rjrudin/marklogic/mgmt/ManageConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,42 @@ public ManageConfig(String host, int port, String username, String password) {
setAdminPassword(password);
}

/**
* Convenience method for building a new instance from the following system properties: mlManageHost, mlManagePort,
* mlManageUsername, mlManagePassword, mlAdminUsername, and mlAdminPassword. First created to assist with groovysh
* integration.
*
* @return
*/
public static ManageConfig buildFromSystemProps() {
ManageConfig c = new ManageConfig();
String prop = System.getProperty("mlManageHost");
if (prop != null) {
c.setHost(prop);
}
prop = System.getProperty("mlManagePort");
if (prop != null) {
c.setPort(Integer.parseInt(prop));
}
prop = System.getProperty("mlManageUsername");
if (prop != null) {
c.setUsername(prop);
}
prop = System.getProperty("mlManagePassword");
if (prop != null) {
c.setPassword(prop);
}
prop = System.getProperty("mlAdminUsername");
if (prop != null) {
c.setAdminUsername(prop);
}
prop = System.getProperty("mlAdminPassword");
if (prop != null) {
c.setAdminPassword(prop);
}
return c;
}

public String getAdminUsername() {
return adminUsername;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,19 @@ public SaveReceipt save(String payload) {
if (logger.isInfoEnabled()) {
logger.info("Immediately updating alert config after it's been created to ensure that CPF domains are set");
}
super.save(payload);
// Calling updateResource instead of save to avoid any chance of an infinite loop
return super.updateResource(payload, getResourceId(payload));
}
return receipt;
}

/**
* Deletes all alert configs, which will also delete all actions and rules associated with each config (this is
* contrary to deleting a flexrep config, where the associated targets must first be deleted).
*/
public void deleteAllConfigs() {
for (String nameref : getAsXml().getListItemNameRefs()) {
deleteByIdField(nameref);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,12 @@ public DatabaseManager(ManageClient manageClient) {
public void clearDatabase(String databaseIdOrName) {
String path = format("/manage/v2/databases/%s", databaseIdOrName);
logger.info(format("Clearing database %s", databaseIdOrName));
getManageClient().postJson(path, "{\"operation\":\"clear-database\"}");
logger.info(format("Cleared database %s", databaseIdOrName));
try {
getManageClient().postJson(path, "{\"operation\":\"clear-database\"}");
logger.info(format("Cleared database %s", databaseIdOrName));
} catch (Exception e) {
logger.error("Unable to clear database; cause: " + e.getMessage());
}
}

public void deleteByName(String databaseName) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,16 @@ protected String getIdFieldName() {
return "domain-name";
}

/**
* Iterate over every config and delete all the targets first, then delete the config.
*/
public void deleteAllConfigs() {
for (String nameref : getAsXml().getListItemNameRefs()) {
TargetManager mgr = new TargetManager(getManageClient(), this.databaseIdOrName, nameref);
for (String idref : mgr.getAsXml().getListItemIdRefs()) {
mgr.deleteByIdField(idref);
}
deleteByIdField(nameref);
}
}
}
10 changes: 10 additions & 0 deletions src/main/java/com/rjrudin/marklogic/mgmt/tasks/TaskManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,17 @@ public boolean exists(String resourceNameOrId) {
resourceNameOrId));
}

public void deleteAllScheduledTasks() {
for (String id : getAsXml().getListItemIdRefs()) {
deleteAtPath(getResourcesPath() + "/" + id + "?group-id=" + groupName);
}
}

public void setGroupName(String groupName) {
this.groupName = groupName;
}

public String getGroupName() {
return groupName;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.rjrudin.marklogic.rest.util;

import java.util.List;

import org.jdom2.Namespace;

/**
Expand Down Expand Up @@ -37,4 +39,17 @@ public String getListItemValue(String resourceIdOrName, String elementLocalName)
xpath = String.format(xpath, resourceIdOrName, resourceIdOrName, elementLocalName);
return getElementValue(xpath);
}

public List<String> getListItemIdRefs() {
return getListItemValues("idref");
}

public List<String> getListItemNameRefs() {
return getListItemValues("nameref");
}

public List<String> getListItemValues(String elementName) {
String xpath = "/node()/*[local-name(.) = 'list-items']/node()/*[local-name(.) = '%s']";
return getElementValues(String.format(xpath, elementName));
}
}
Loading