/** * verifies compilation, instanciation and that it is a ZuulFilter * * @param sFilterCode * @return a FilterInfo object representing that code * @throws org.codehaus.groovy.control.CompilationFailedException * * @throws IllegalAccessException * @throws InstantiationException */ public FilterInfo verifyFilter(String sFilterCode) throws org.codehaus.groovy.control.CompilationFailedException, IllegalAccessException, InstantiationException { Class groovyClass = compileGroovy(sFilterCode); Object instance = instanciateClass(groovyClass); checkZuulFilterInstance(instance); BaseFilter filter = (BaseFilter) instance; String filter_id = FilterInfo.buildFilterID(ZuulApplicationInfo.getApplicationName(), filter.filterType(), groovyClass.getSimpleName()); return new FilterInfo(filter_id, sFilterCode, filter.filterType(), groovyClass.getSimpleName(), filter.disablePropertyName(), "" + filter.filterOrder(), ZuulApplicationInfo.getApplicationName()); }
@Override public int compareTo(FilterInfo filterInfo) { if(filterInfo.getFilterName().equals(this.getFilterName())){ return filterInfo.creationDate.compareTo(getCreationDate()); } return filterInfo.getFilterName().compareTo(this.getFilterName()); }
FilterInfo filterInfo = FilterVerifier.INSTANCE.verifyFilter(sGoodGroovyScriptFilter); assertNotNull(filterInfo); assertEquals(filterInfo.getFilterID(), "null:filter:in"); assertEquals(filterInfo.getFilterType(), FilterType.INBOUND); assertEquals(filterInfo.getFilterName(), "filter"); assertFalse(filterInfo.isActive()); assertFalse(filterInfo.isCanary());
assertEquals(filter, filterInfo.getFilterID()); assertEquals(3, filterInfo.getRevision()); assertEquals(true, filterInfo.isActive()); assertEquals(now.getTime(), filterInfo.getCreationDate()); assertEquals("script body 1", filterInfo.getFilterCode());
private Map<String, Object> createExpectedJsonMap(FilterInfo script) { Map<String, Object> expectedJson = new LinkedHashMap<String, Object>(); expectedJson.put("filter_id", script.getFilterID()); expectedJson.put("filter_name", script.getFilterName()); expectedJson.put("filter_type", script.getFilterType()); expectedJson.put("revision", script.getRevision()); expectedJson.put("active", script.isActive()); expectedJson.put("creationDate", script.getCreationDate()); expectedJson.put("canary", script.isCanary()); return expectedJson; }
private FilterInfo mockEndpointScript() { Calendar now = Calendar.getInstance(); FilterInfo script = mock(FilterInfo.class); when(script.getCreationDate()).thenReturn(now.getTime()); when(script.getRevision()).thenReturn(1); when(script.isActive()).thenReturn(false); when(script.isCanary()).thenReturn(false); return script; } }
private void writeFilterToDisk(FilterInfo newFilter) throws IOException { String path = DynamicPropertyFactory.getInstance().getStringProperty(ZuulConstants.ZUUL_FILTER_PRE_PATH, null).get(); if (newFilter.getFilterType().equals("post")) { path = DynamicPropertyFactory.getInstance().getStringProperty(ZuulConstants.ZUUL_FILTER_POST_PATH, null).get(); } if (newFilter.getFilterType().equals("route")) { path = DynamicPropertyFactory.getInstance().getStringProperty(ZuulConstants.ZUUL_FILTER_ROUTING_PATH, null).get(); } File f = new File(path, newFilter.getFilterName() + ".groovy"); FileWriter file = new FileWriter(f); BufferedWriter out = new BufferedWriter(file); out.write(newFilter.getFilterCode()); out.close(); file.close(); System.out.println("filter written " + f.getPath()); }
@Override public FilterInfo deActivateFilter(String filter_id, int revision) throws Exception { FilterInfo filter = getFilterInfo(filter_id, revision); if (filter == null) throw new Exception("Filter not Found " + filter_id + "revision:" + revision); if (!filter.isCanary() && !filter.isActive()) { throw new Exception("Filter must be canary or active to deactivate" + filter_id + "revision:" + revision); } removeFilterIdFromIndex(ACTIVE_SCRIPTS + ZuulApplicationInfo.getApplicationName(), filter_id + "_" + filter.getRevision()); removeFilterIdFromIndex(CANARY_SCRIPTS + ZuulApplicationInfo.getApplicationName(), filter_id + "_" + filter.getRevision()); /* activate the revision */ Map<String, Object> attributesForActivation = new HashMap<String, Object>(); attributesForActivation.put("active", false); attributesForActivation.put("canary", false); cassandraGateway.upsert(filter_id + "_" + revision, attributesForActivation); setChanged(); notifyObservers(new ZuulEvent("ZUUL_SCRIPT_CHANGE", "DEACTIVATED ZUUL FILTER id = " + filter_id + " revision = " + revision)); return getFilterInfoForFilter(filter_id, revision); }
@Test public void creationDateIsCopiedInGetter() { FilterInfo filterInfo = new FilterInfo("", "", "", "", "", "", ""); long originalCreationTime = filterInfo.getCreationDate().getTime(); filterInfo.getCreationDate().setTime(0); assertThat(filterInfo.getCreationDate().getTime(), is(originalCreationTime)); }
private void handleUploadAction(HttpServletRequest request, HttpServletResponse response) throws IOException { String filter = handlePostBody(request, response); if (filter != null) { FilterInfo filterInfo = null; try { filterInfo = FilterVerifier.getInstance().verifyFilter(filter); } catch (IllegalAccessException e) { logger.error(e.getMessage(), e); setUsageError(500, "ERROR: Unable to process uploaded data. " + e.getMessage(), response); } catch (InstantiationException e) { logger.error(e.getMessage(), e); setUsageError(500, "ERROR: Bad Filter. " + e.getMessage(), response); } filterInfo = scriptDAO.addFilter(filter, filterInfo.getFilterType(), filterInfo.getFilterName(), filterInfo.getFilterDisablePropertyName(), filterInfo.getFilterOrder()); if (filterInfo == null) { setUsageError(500, "ERROR: Unable to process uploaded data.", response); return; } response.sendRedirect(redirectPath.get()); } }
private void doFilterCheck(FilterInfo newFilter) throws IOException { FilterInfo existingFilter = runningFilters.get(newFilter.getFilterID()); if (existingFilter == null || !existingFilter.equals(newFilter)) { System.out.println("adding filter to disk" + newFilter.toString()); writeFilterToDisk(newFilter); runningFilters.put(newFilter.getFilterID(), newFilter); } }
public FilterInfo getCanaryScriptForFilter(String filter_id) { List<FilterInfo> filterInfos = getFiltersForIndex(CANARY_SCRIPTS + ZuulApplicationInfo.getApplicationName()); for (int i = 0; i < filterInfos.size(); i++) { FilterInfo filterInfo = filterInfos.get(i); if (filterInfo.getFilterID().equals(filter_id)) return filterInfo; } return null; }
if (!filter.isCanary()) { throw new Exception("Filter must be canaried before activated " + filter_id + "revision:" + revision); revisionsToDeactivate.add(filterInfo.getRevision()); removeFilterIdFromIndex(ACTIVE_SCRIPTS + ZuulApplicationInfo.getApplicationName(), filter_id + "_" + filterInfo.getRevision());
scriptsForEndpoint.add(new FilterInfo("name1:type", "code", "type", "name", "disable", "order", "app")); scriptsForEndpoint.add(new FilterInfo("name2:type", "code", "type", "name", "disable", "order", "app")); scriptsForEndpoint.add(new FilterInfo("name3:type", "code", "type", "name", "disable", "order", "app")); when(dao.getZuulFiltersForFilterId(anyString())).thenReturn(scriptsForEndpoint);
public String buildFilterId() { return buildFilterID(application_name, filter_type, filter_name); }
@Test public void testDownloadSingleScriptRevision() throws Exception { /* setup mock */ String filter_id = "name:type"; String action = "DOWNLOAD"; when(request.getPathInfo()).thenReturn("?action=" + action + "&filter_id=" + filter_id + "&revision=2"); when(request.getMethod()).thenReturn("GET"); when(request.getParameter("action")).thenReturn(action); when(request.getParameter("filter_id")).thenReturn(filter_id); when(request.getParameter("revision")).thenReturn("2"); /* setup mock DAO */ ZuulFilterDAO dao = mock(ZuulFilterDAOCassandra.class); FilterInfo script = mock(FilterInfo.class); when(dao.getFilterInfoForFilter(filter_id, 2)).thenReturn(script); String code = "code"; when(script.getFilterCode()).thenReturn(code); FilterScriptManagerServlet servlet = getEndpointScriptManagerImplementation(dao); servlet.service(request, response); /* verify the default status is used */ verify(response, never()).setStatus(anyInt()); // verify mime-type verify(response).setContentType("text/plain"); // verify the script is written to the response verify(responseWriter).write("code"); }
assertEquals(filter, filterInfo.getFilterID()); assertEquals(3, filterInfo.getRevision()); assertEquals(true, filterInfo.isActive()); assertEquals(now.getTime(), filterInfo.getCreationDate()); assertEquals("script body 1", filterInfo.getFilterCode());
private Map<String, Object> createEndpointScriptJSON(FilterInfo script) { Map<String, Object> scriptJson = new LinkedHashMap<String, Object>(); scriptJson.put("filter_id", script.getFilterID()); scriptJson.put("filter_name", script.getFilterName()); scriptJson.put("filter_type", script.getFilterType()); scriptJson.put("revision", script.getRevision()); scriptJson.put("active", script.isActive()); scriptJson.put("creationDate", script.getCreationDate()); scriptJson.put("canary", script.isCanary()); return scriptJson; }
private void writeFilterToDisk(FilterInfo newFilter) throws IOException { String path = DynamicPropertyFactory.getInstance().getStringProperty(ZuulConstants.ZUUL_FILTER_PRE_PATH, null).get(); if (newFilter.getFilterType().equals(FilterType.OUTBOUND)) { path = DynamicPropertyFactory.getInstance().getStringProperty(ZuulConstants.ZUUL_FILTER_POST_PATH, null).get(); } if (newFilter.getFilterType().equals(FilterType.ENDPOINT)) { path = DynamicPropertyFactory.getInstance().getStringProperty(ZuulConstants.ZUUL_FILTER_ROUTING_PATH, null).get(); } File f = new File(path, newFilter.getFilterName() + ".groovy"); FileWriter file = new FileWriter(f); BufferedWriter out = new BufferedWriter(file); out.write(newFilter.getFilterCode()); out.close(); file.close(); System.out.println("filter written " + f.getPath()); }