From 1a711038698490b1f6423e3e4801ae98598d0366 Mon Sep 17 00:00:00 2001 From: Dmitry Sen Date: Thu, 31 Jan 2019 14:54:24 +0700 Subject: [PATCH] [AMBARI-25131] Alert notification properties are wiped after enabling/disabling the notification (dsen) (#2786) --- .../internal/AlertTargetResourceProvider.java | 17 +++++-- .../AlertTargetResourceProviderTest.java | 47 +++++++++++++++++++ 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProvider.java index dc0fd574e02..be18477677d 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProvider.java @@ -422,9 +422,14 @@ void updateAlertTargets(long alertTargetId, entity.setNotificationType(notificationType); } - String properties = s_gson.toJson(extractProperties(requestMap)); - if (!StringUtils.isEmpty(properties)) { - entity.setProperties(properties); + Map propertiesMap = extractProperties(requestMap); + + if (propertiesMap != null) { + String properties = s_gson.toJson(propertiesMap); + if (!StringUtils.isEmpty(properties)) { + LOG.debug("Updating Alert Target properties map to: " + properties); + entity.setProperties(properties); + } } // a null alert state implies that the key was not set and no update @@ -533,17 +538,23 @@ private Resource toResource(AlertTargetEntity entity, Set requestedIds) private Map extractProperties(Map requestMap) { Map normalizedMap = new HashMap<>( requestMap.size()); + boolean has_properties = false; for (Entry entry : requestMap.entrySet()) { String key = entry.getKey(); String propCat = PropertyHelper.getPropertyCategory(key); if (propCat.equals(ALERT_TARGET_PROPERTIES)) { + has_properties = true; String propKey = PropertyHelper.getPropertyName(key); normalizedMap.put(propKey, entry.getValue()); } } + if (!has_properties) { + normalizedMap = null; + } + return normalizedMap; } diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProviderTest.java index efedd2b123c..b20dd9f61a6 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProviderTest.java @@ -1007,6 +1007,53 @@ public void testUpdateAlertTargetsWithAllGroups() throws Exception{ verify(m_amc, m_dao); } + @Test + public void testEnable() throws Exception { + Capture entityCapture = EasyMock.newCapture(); + m_dao.create(capture(entityCapture)); + expectLastCall().times(1); + + AlertTargetEntity target = new AlertTargetEntity(); + target.setEnabled(false); + target.setProperties("{prop1=val1}"); + expect(m_dao.findTargetById(ALERT_TARGET_ID)).andReturn(target).times(1); + + expect(m_dao.merge(capture(entityCapture))).andReturn(target).once(); + + replay(m_amc, m_dao); + + SecurityContextHolder.getContext().setAuthentication(TestAuthenticationFactory.createAdministrator()); + + AlertTargetResourceProvider provider = createProvider(m_amc); + Map requestProps = getCreationProperties(); + Request request = PropertyHelper.getCreateRequest( + Collections.singleton(requestProps), null); + provider.createResources(request); + + // create new properties, and include the ID since we're not going through + // a service layer which would add it for us automatically + requestProps = new HashMap<>(); + requestProps.put(AlertTargetResourceProvider.ALERT_TARGET_ID, + ALERT_TARGET_ID.toString()); + + requestProps.put(AlertTargetResourceProvider.ALERT_TARGET_ENABLED, + "true"); + + Predicate predicate = new PredicateBuilder().property( + AlertTargetResourceProvider.ALERT_TARGET_ID).equals( + ALERT_TARGET_ID.toString()).toPredicate(); + + request = PropertyHelper.getUpdateRequest(requestProps, null); + provider.updateResources(request, predicate); + + assertTrue(entityCapture.hasCaptured()); + + AlertTargetEntity entity = entityCapture.getValue(); + assertTrue("{prop1=val1}".equals(entity.getProperties())); + assertTrue(entity.isEnabled()); + verify(m_amc, m_dao); + } + /** * @param amc * @return