From 2cf945c0f6445d8ce913f8ba7e4d41658518550e Mon Sep 17 00:00:00 2001 From: Vladimir Yussupov Date: Sun, 29 Oct 2023 00:26:27 +0200 Subject: [PATCH] Fix tests --- ...ClassificationFrameworkControllerTest.java | 25 +- .../FilterConfigurationControllerTest.java | 8 +- .../controllers/TechnologyControllerTest.java | 6 +- ...ficationFrameworkEntityRepositoryTest.java | 62 -- ...ClassificationFrameworkRepositoryTest.java | 154 ++++ .../core/repositories/MongoDataFile.java | 34 + .../MongoRepositoryTestExtension.java | 95 +++ .../ClassificationFrameworkServiceTest.java | 23 +- .../core/services/TechnologyServiceTest.java | 8 +- .../resources/data/cu2-td-azurefunctions.json | 138 ++++ src/test/resources/data/cu2-td-fission.json | 110 +++ src/test/resources/data/cu2-td-fn.json | 105 +++ src/test/resources/data/cu2-td-gcf.json | 112 +++ src/test/resources/data/cu2-td-knative.json | 111 +++ src/test/resources/data/cu2-td-kubeless.json | 104 +++ src/test/resources/data/cu2-td-lambda.json | 131 ++++ src/test/resources/data/cu2-td-nuclio.json | 118 +++ src/test/resources/data/cu2-td-openfaas.json | 126 +++ src/test/resources/data/cu2-td-openwhisk.json | 129 +++ src/test/resources/data/cu2-technologies.json | 82 ++ src/test/resources/data/cu3-filters.json | 253 ++++++ src/test/resources/data/cu4-resources.json | 97 +++ src/test/resources/data/framework.json | 733 ++++++++++++++++++ 23 files changed, 2678 insertions(+), 86 deletions(-) delete mode 100644 src/test/java/org/faastener/core/repositories/ClassificationFrameworkEntityRepositoryTest.java create mode 100644 src/test/java/org/faastener/core/repositories/ClassificationFrameworkRepositoryTest.java create mode 100644 src/test/java/org/faastener/core/repositories/MongoDataFile.java create mode 100644 src/test/java/org/faastener/core/repositories/MongoRepositoryTestExtension.java create mode 100644 src/test/resources/data/cu2-td-azurefunctions.json create mode 100644 src/test/resources/data/cu2-td-fission.json create mode 100644 src/test/resources/data/cu2-td-fn.json create mode 100644 src/test/resources/data/cu2-td-gcf.json create mode 100644 src/test/resources/data/cu2-td-knative.json create mode 100644 src/test/resources/data/cu2-td-kubeless.json create mode 100644 src/test/resources/data/cu2-td-lambda.json create mode 100644 src/test/resources/data/cu2-td-nuclio.json create mode 100644 src/test/resources/data/cu2-td-openfaas.json create mode 100644 src/test/resources/data/cu2-td-openwhisk.json create mode 100644 src/test/resources/data/cu2-technologies.json create mode 100644 src/test/resources/data/cu3-filters.json create mode 100644 src/test/resources/data/cu4-resources.json create mode 100644 src/test/resources/data/framework.json diff --git a/src/test/java/org/faastener/core/controllers/ClassificationFrameworkControllerTest.java b/src/test/java/org/faastener/core/controllers/ClassificationFrameworkControllerTest.java index b4321af..b25f142 100644 --- a/src/test/java/org/faastener/core/controllers/ClassificationFrameworkControllerTest.java +++ b/src/test/java/org/faastener/core/controllers/ClassificationFrameworkControllerTest.java @@ -6,14 +6,18 @@ import java.util.Optional; import com.fasterxml.jackson.databind.ObjectMapper; -import org.faastener.core.model.entities.ClassificationFrameworkEntity; import org.faastener.core.model.common.TechnologyType; +import org.faastener.core.model.domain.ClassificationFramework; +import org.faastener.core.model.domain.ClassificationFramework.CriteriaGrouping; +import org.faastener.core.model.domain.ClassificationFramework.CriterionType; +import org.faastener.core.model.domain.ClassificationFramework.FrameworkView; import org.faastener.core.services.ClassificationFrameworkService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.core.io.ClassPathResource; import org.springframework.http.HttpHeaders; @@ -33,7 +37,8 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @ExtendWith(SpringExtension.class) -@WebMvcTest(ClassificationFrameworkController.class) +@SpringBootTest +@AutoConfigureMockMvc @TestPropertySource(properties = "mongock.enabled=false") class ClassificationFrameworkControllerTest { @MockBean @@ -46,7 +51,7 @@ class ClassificationFrameworkControllerTest { @DisplayName("GET /api/frameworks/{id} - Found") void testGetFrameworkByIdFound() throws Exception { ObjectMapper mapper = new ObjectMapper(); - ClassificationFrameworkEntity mockFramework = mapper.readValue(new ClassPathResource("data/cu1-frameworks.json").getFile(), ClassificationFrameworkEntity.class); + ClassificationFramework mockFramework = mapper.readValue(new ClassPathResource("data/cu1-frameworks.json").getFile(), ClassificationFramework.class); doReturn(Optional.of(mockFramework)).when(frameworkService).findById("fwFaaS"); mockMvc.perform(get("/api/frameworks/{id}", "fwFaaS")) @@ -78,12 +83,12 @@ void testGetFrameworkByIdNotFound() throws Exception { @Test @DisplayName("POST /api/frameworks - Success") void testCreateFramework() throws Exception { - List mockCriteria = new ArrayList<>(); - mockCriteria.add(new ClassificationFrameworkEntity.CriterionTypeEntity("criterion1", "criterion type 1", "criterion type 1 description", Collections.emptyList())); - mockCriteria.add(new ClassificationFrameworkEntity.CriterionTypeEntity("criterion1", "criterion type 2", "criterion type 2 description", Collections.emptyList())); - ClassificationFrameworkEntity.CriteriaGroupingEntity mockGrouping = new ClassificationFrameworkEntity.CriteriaGroupingEntity("groupingId", "test grouping", "grouping description", Collections.emptyList(), mockCriteria); - ClassificationFrameworkEntity.FrameworkViewEntity mockView = new ClassificationFrameworkEntity.FrameworkViewEntity("viewId", "test view", "view description", Collections.singletonList(mockGrouping)); - ClassificationFrameworkEntity mockFramework = new ClassificationFrameworkEntity("frameworkId", "test", TechnologyType.FAAS, "1.0", "some description", Collections.singletonList(mockView)); + List mockCriteria = new ArrayList<>(); + mockCriteria.add(new CriterionType("criterion1", "criterion type 1", "criterion type 1 description", Collections.emptyList())); + mockCriteria.add(new CriterionType("criterion1", "criterion type 2", "criterion type 2 description", Collections.emptyList())); + CriteriaGrouping mockGrouping = new CriteriaGrouping("groupingId", "test grouping", "grouping description", Collections.emptyList(), mockCriteria); + FrameworkView mockView = new FrameworkView("viewId", "test view", "view description", Collections.singletonList(mockGrouping)); + ClassificationFramework mockFramework = new ClassificationFramework("frameworkId", "test", TechnologyType.FAAS, "1.0", "some description", Collections.singletonList(mockView)); doReturn(mockFramework).when(frameworkService).save(any()); diff --git a/src/test/java/org/faastener/core/controllers/FilterConfigurationControllerTest.java b/src/test/java/org/faastener/core/controllers/FilterConfigurationControllerTest.java index fe69939..e92f7d4 100644 --- a/src/test/java/org/faastener/core/controllers/FilterConfigurationControllerTest.java +++ b/src/test/java/org/faastener/core/controllers/FilterConfigurationControllerTest.java @@ -4,13 +4,16 @@ import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import org.faastener.core.model.domain.FilterConfiguration; import org.faastener.core.model.entities.FilterConfigurationEntity; import org.faastener.core.services.FilterConfigurationService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.core.io.ClassPathResource; import org.springframework.http.HttpHeaders; @@ -28,7 +31,8 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @ExtendWith(SpringExtension.class) -@WebMvcTest(FilterConfigurationController.class) +@SpringBootTest +@AutoConfigureMockMvc @TestPropertySource(properties = "mongock.enabled=false") class FilterConfigurationControllerTest { @MockBean @@ -42,7 +46,7 @@ class FilterConfigurationControllerTest { void testGetFilterConfigurationByIdFound() throws Exception { ObjectMapper mapper = new ObjectMapper(); mapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS); - FilterConfigurationEntity mockFilterConfiguration = mapper.readValue(new ClassPathResource("data/cu3-filters.json").getFile(), FilterConfigurationEntity.class); + FilterConfiguration mockFilterConfiguration = mapper.readValue(new ClassPathResource("data/cu3-filters.json").getFile(), FilterConfiguration.class); doReturn(Optional.of(mockFilterConfiguration)).when(filterConfigurationService).findById("faas-filter"); mockMvc.perform(get("/api/filters/{id}", "faas-filter")) diff --git a/src/test/java/org/faastener/core/controllers/TechnologyControllerTest.java b/src/test/java/org/faastener/core/controllers/TechnologyControllerTest.java index b6203e3..336d2d1 100644 --- a/src/test/java/org/faastener/core/controllers/TechnologyControllerTest.java +++ b/src/test/java/org/faastener/core/controllers/TechnologyControllerTest.java @@ -15,7 +15,9 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.modelmapper.ModelMapper; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.core.io.ClassPathResource; import org.springframework.http.HttpHeaders; @@ -33,8 +35,8 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @TestPropertySource(properties = "mongock.enabled=false") -@ExtendWith(SpringExtension.class) -@WebMvcTest(TechnologyController.class) +@SpringBootTest +@AutoConfigureMockMvc class TechnologyControllerTest { @MockBean private TechnologyService technologiesService; diff --git a/src/test/java/org/faastener/core/repositories/ClassificationFrameworkEntityRepositoryTest.java b/src/test/java/org/faastener/core/repositories/ClassificationFrameworkEntityRepositoryTest.java deleted file mode 100644 index b2e9df5..0000000 --- a/src/test/java/org/faastener/core/repositories/ClassificationFrameworkEntityRepositoryTest.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.faastener.core.repositories; - -import java.util.Optional; - -import com.fasterxml.jackson.databind.ObjectMapper; -import jdk.jfr.Category; -import org.faastener.core.model.entities.ClassificationFrameworkEntity; -import org.faastener.core.model.common.TechnologyType; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; -import org.springframework.core.io.ClassPathResource; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -@ExtendWith(SpringExtension.class) -@DataMongoTest -@TestPropertySource(properties = "mongock.enabled=false") -@Category("integration") -class ClassificationFrameworkEntityRepositoryTest { - @Autowired - private MongoTemplate mongoTemplate; - - @Autowired - private ClassificationFrameworkRepository repository; - - private final ObjectMapper mapper = new ObjectMapper(); - - @BeforeEach - void beforeEach() throws Exception { - ClassificationFrameworkEntity framework = mapper.readValue(new ClassPathResource("data/cu1-frameworks.json").getFile(), ClassificationFrameworkEntity.class); - - mongoTemplate.save(framework); - } - - @AfterEach - void afterEach() { - mongoTemplate.dropCollection("frameworks"); - } - - @Test - void testFindByIdSuccess() { - Optional framework = repository.findById("fwFaaS"); - Assertions.assertTrue(framework.isPresent(), "Framework with the given ID should be present"); - framework.ifPresent(fw -> { - Assertions.assertEquals("fwFaaS", fw.getId(), "Framework ID should be fwFaaS"); - Assertions.assertEquals(TechnologyType.FAAS, fw.getTechnologyType(), "Framework type should be FAAS"); - Assertions.assertEquals(2, fw.getFrameworkViews().size(), "Framework with ID fw-faas should have 2 views"); - }); - } - - @Test - void testFindByIdFailure() { - Optional framework = repository.findById("absentID"); - Assertions.assertFalse(framework.isPresent(), "No framework with ID absentID should exist"); - } -} diff --git a/src/test/java/org/faastener/core/repositories/ClassificationFrameworkRepositoryTest.java b/src/test/java/org/faastener/core/repositories/ClassificationFrameworkRepositoryTest.java new file mode 100644 index 0000000..bc30f7a --- /dev/null +++ b/src/test/java/org/faastener/core/repositories/ClassificationFrameworkRepositoryTest.java @@ -0,0 +1,154 @@ +package org.faastener.core.repositories; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +import org.faastener.core.model.common.TechnologyType; +import org.faastener.core.model.entities.ClassificationFrameworkEntity; +import org.faastener.core.model.entities.ClassificationFrameworkEntity.CriteriaGroupingEntity; +import org.faastener.core.model.entities.ClassificationFrameworkEntity.CriterionTypeEntity; +import org.faastener.core.model.entities.ClassificationFrameworkEntity.FrameworkViewEntity; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.test.context.TestPropertySource; + +@DataMongoTest +@ExtendWith(MongoRepositoryTestExtension.class) +@TestPropertySource(properties = "mongock.enabled=false") +class ClassificationFrameworkRepositoryTest { + @Autowired + private MongoTemplate mongoTemplate; + + @Autowired + private ClassificationFrameworkRepository repository; + + + public MongoTemplate getMongoTemplate() { + return mongoTemplate; + } + + @Test + @MongoDataFile(value = "framework.json", classType = ClassificationFrameworkEntity.class, collectionName = "frameworks") + void testSave() { + ClassificationFrameworkEntity framework1 = initTestFramework(2, 3, 3); + ClassificationFrameworkEntity savedFramework1 = repository.save(framework1); + + // Retrieve the review + Optional loadedFramework1 = repository.findById(savedFramework1.getId()); + + // Validations + Assertions.assertTrue(loadedFramework1.isPresent()); + + loadedFramework1.ifPresent(f1 -> { + Assertions.assertEquals(framework1.getId(), f1.getId()); + Assertions.assertEquals(framework1.getName(), f1.getName()); + Assertions.assertEquals(framework1.getDescription(), f1.getDescription()); + Assertions.assertEquals(framework1.getVersion(), f1.getVersion()); + Assertions.assertEquals(2, f1.getFrameworkViews().size(), "There should be 2 views"); + }); + } + + @Test + @MongoDataFile(value = "framework.json", classType = ClassificationFrameworkEntity.class, collectionName = "frameworks") + void testSaveAll() { + ClassificationFrameworkEntity framework1 = initTestFramework(2, 3, 3); + ClassificationFrameworkEntity framework2 = initTestFramework(1, 2, 4); + + List savedFrameworks = repository.saveAll(List.of(framework1, framework2)); + + // Retrieve the review + List loadedFrameworks = repository.findAll(); + + // Validations + Assertions.assertEquals(2, loadedFrameworks.size()); + } + + @Test + @MongoDataFile(value = "framework.json", classType = ClassificationFrameworkEntity.class, collectionName = "frameworks") + void testFindByIdSuccess() { + Optional framework = repository.findById("fwFaaS"); + Assertions.assertTrue(framework.isPresent(), "Framework with the given ID should be present"); + framework.ifPresent(fw -> { + Assertions.assertEquals("fwFaaS", fw.getId(), "Framework ID should be fwFaaS"); + Assertions.assertEquals(TechnologyType.FAAS, fw.getTechnologyType(), "Framework type should be FAAS"); + Assertions.assertEquals(2, fw.getFrameworkViews().size(), "Framework with ID fw-faas should have 2 views"); + }); + } + + @Test + @MongoDataFile(value = "framework.json", classType = ClassificationFrameworkEntity.class, collectionName = "frameworks") + void testFindByIdFailure() { + Optional framework = repository.findById("absentID"); + Assertions.assertFalse(framework.isPresent(), "No framework with ID absentID should exist"); + } + + private ClassificationFrameworkEntity initTestFramework(int numViews, int numGroupings, int criteriaTypesPerGrouping) { + ClassificationFrameworkEntity framework = new ClassificationFrameworkEntity(); + framework.setId("test-fw-id"); + framework.setName("test-fw-name"); + framework.setDescription("test-desc"); + framework.setVersion("1.0.0"); + + framework.setFrameworkViews(initTestViews(numViews, numGroupings, criteriaTypesPerGrouping)); + + return framework; + } + + private List initTestViews(int numViews, int groupingsPerView, int criteriaTypesPerGrouping) { + List views = new ArrayList<>(); + + for (int view = 1; view <= numViews; view++) { + FrameworkViewEntity v = new FrameworkViewEntity(); + v.setId("test-view-id-" + view); + v.setName("test-view-" + view); + v.setDescription("test-view-desc-" + view); + v.setCriteriaGroupings(initTestGroupings(groupingsPerView, criteriaTypesPerGrouping)); + + views.add(v); + } + + return views; + } + + private List initTestGroupings(int numGroupings, int criteriaTypesPerGrouping) { + List groupings = new ArrayList<>(); + + for (int grouping = 1; grouping <= numGroupings; grouping++) { + CriteriaGroupingEntity g = new CriteriaGroupingEntity(); + g.setId("test-grouping-id-" + grouping); + g.setName("test-grouping-name-" + grouping); + g.setLocator("test-grouping-locator-" + grouping); + g.setCriteria(initTestCriteriaTypes(criteriaTypesPerGrouping)); + + groupings.add(g); + } + + return groupings; + } + + private List initTestCriteriaTypes(int numCrtieriaTypes) { + List criteriaTypes = new ArrayList<>(); + + for (int type = 1; type <= numCrtieriaTypes; type++) { + CriterionTypeEntity ct = new CriterionTypeEntity(); + ct.setId("test-criterion-type-id-" + type); + ct.setName("test-criterion-type-name-id-" + type); + ct.setDescription("test-criterion-type-desc-id-" + type); + ct.setExampleValues(Collections.singletonList("single example")); + + criteriaTypes.add(ct); + } + + return criteriaTypes; + } +} + + + + diff --git a/src/test/java/org/faastener/core/repositories/MongoDataFile.java b/src/test/java/org/faastener/core/repositories/MongoDataFile.java new file mode 100644 index 0000000..24fbbee --- /dev/null +++ b/src/test/java/org/faastener/core/repositories/MongoDataFile.java @@ -0,0 +1,34 @@ +package org.faastener.core.repositories; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * An annotation that provides information about the test MongoDB JSON file, collection name, and type of objects stored in the test file + */ +@Target( {ElementType.METHOD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface MongoDataFile { + /** + * The name of the MongoDB JSON test file. + * + * @return The name of the MongoDB JSON test file. + */ + String value(); + + /** + * The class of objects stored in the MongoDB test file. + * + * @return The class of objects stored in the MongoDB test file. + */ + Class classType(); + + /** + * The name of the MongoDB collection hosting the test objects. + * + * @return The name of the MongoDB collection hosting the test objects. + */ + String collectionName(); +} diff --git a/src/test/java/org/faastener/core/repositories/MongoRepositoryTestExtension.java b/src/test/java/org/faastener/core/repositories/MongoRepositoryTestExtension.java new file mode 100644 index 0000000..1293f96 --- /dev/null +++ b/src/test/java/org/faastener/core/repositories/MongoRepositoryTestExtension.java @@ -0,0 +1,95 @@ +package org.faastener.core.repositories; + +import java.io.IOException; +import java.lang.reflect.Method; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.Optional; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.BeforeEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.springframework.data.mongodb.core.MongoTemplate; + +public class MongoRepositoryTestExtension implements BeforeEachCallback, AfterEachCallback { + private static final Path JSON_PATH = Paths.get("src", "test", "resources", "data"); + + /** + * Jackson ObjectMapper: used to load a JSON file into a list of objects + */ + private final ObjectMapper mapper = new ObjectMapper(); + + /** + * Called before each test executes. This callback is responsible for importing the JSON document, defined + * by the MongoDataFile annotation, into the embedded MongoDB, through the provided MongoTemplate. + * + * @param context The ExtensionContext, which provides access to the test method. + */ + @Override + public void beforeEach(ExtensionContext context) { + context.getTestMethod().ifPresent(method -> { + // Load test file from the annotation + MongoDataFile mongoDataFile = method.getAnnotation(MongoDataFile.class); + + // Load the MongoTemplate that we can use to import our data + getMongoTemplate(context).ifPresent(mongoTemplate -> { + try { + // Use Jackson's ObjectMapper to load a list of objects from the JSON file + List objects = mapper.readValue(JSON_PATH.resolve(mongoDataFile.value()).toFile(), + mapper.getTypeFactory().constructCollectionType(List.class, mongoDataFile.classType())); + + // Save each object into MongoDB + objects.forEach(mongoTemplate::save); + } catch (IOException ioException) { + ioException.printStackTrace(); + } + }); + }); + } + + /** + * Called after each test executes. This callback is responsible for dropping the test's MongoDB collection + * so that the next test that runs is clean. + * + * @param context The ExtensionContext, which provides access to the test method. + */ + @Override + public void afterEach(ExtensionContext context) { + context.getTestMethod().ifPresent(method -> { + // Load the MongoDataFile annotation value from the test method + MongoDataFile mongoDataFile = method.getAnnotation(MongoDataFile.class); + + // Load the MongoTemplate that we can use to drop the test collection + Optional mongoTemplate = getMongoTemplate(context); + mongoTemplate.ifPresent(t -> t.dropCollection(mongoDataFile.collectionName())); + }); + } + + /** + * Helper method that uses reflection to invoke the getMongoTemplate() method on the test instance. + * + * @param context The ExtensionContext, which provides access to the test instance. + * @return An optional MongoTemplate, if it exists. + */ + private Optional getMongoTemplate(ExtensionContext context) { + Optional> clazz = context.getTestClass(); + if (clazz.isPresent()) { + Class c = clazz.get(); + try { + // Find the getMongoTemplate method on the test class + Method method = c.getMethod("getMongoTemplate"); + + // Invoke the getMongoTemplate method on the test class + Optional testInstance = context.getTestInstance(); + if (testInstance.isPresent()) { + return Optional.of((MongoTemplate) method.invoke(testInstance.get())); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return Optional.empty(); + } +} diff --git a/src/test/java/org/faastener/core/services/ClassificationFrameworkServiceTest.java b/src/test/java/org/faastener/core/services/ClassificationFrameworkServiceTest.java index f2f74c0..6f192d7 100644 --- a/src/test/java/org/faastener/core/services/ClassificationFrameworkServiceTest.java +++ b/src/test/java/org/faastener/core/services/ClassificationFrameworkServiceTest.java @@ -8,6 +8,10 @@ import org.faastener.core.model.common.EntityMapper; import org.faastener.core.model.common.TechnologyType; import org.faastener.core.model.domain.ClassificationFramework; +import org.faastener.core.model.entities.ClassificationFrameworkEntity; +import org.faastener.core.model.entities.ClassificationFrameworkEntity.CriteriaGroupingEntity; +import org.faastener.core.model.entities.ClassificationFrameworkEntity.CriterionTypeEntity; +import org.faastener.core.model.entities.ClassificationFrameworkEntity.FrameworkViewEntity; import org.faastener.core.repositories.ClassificationFrameworkRepository; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; @@ -36,19 +40,22 @@ class ClassificationFrameworkServiceTest { @Test @DisplayName("Test findById - Success") void testFindByIdSuccess() { - List mockCriteria = new ArrayList<>(); - mockCriteria.add(new ClassificationFramework.CriterionType("criterion1", "criterion type 1", "criterion type 1 description", Collections.emptyList())); - mockCriteria.add(new ClassificationFramework.CriterionType("criterion1", "criterion type 2", "criterion type 2 description", Collections.emptyList())); - ClassificationFramework.CriteriaGrouping mockGrouping = new ClassificationFramework.CriteriaGrouping("groupingId", "test grouping", "grouping description", Collections.emptyList(), mockCriteria); - ClassificationFramework.FrameworkView mockView = new ClassificationFramework.FrameworkView("viewId", "test view", "view description", Collections.singletonList(mockGrouping)); - ClassificationFramework mockFramework = new ClassificationFramework("frameworkId", "test", TechnologyType.FAAS, "1.0", "some description", Collections.singletonList(mockView)); + List mockCriteria = new ArrayList<>(); + mockCriteria.add(new CriterionTypeEntity("criterion1", "criterion type 1", "criterion type 1 description", Collections.emptyList())); + mockCriteria.add(new CriterionTypeEntity("criterion1", "criterion type 2", "criterion type 2 description", Collections.emptyList())); + CriteriaGroupingEntity mockGrouping = new CriteriaGroupingEntity("groupingId", "test grouping", "grouping description", Collections.emptyList(), mockCriteria); + FrameworkViewEntity mockView = new FrameworkViewEntity("viewId", "test view", "view description", Collections.singletonList(mockGrouping)); + ClassificationFrameworkEntity mockFrameworkEntity = new ClassificationFrameworkEntity("frameworkId", "test", TechnologyType.FAAS, "1.0", "some description", Collections.singletonList(mockView)); - doReturn(Optional.of(mockFramework)).when(repository).findById("frameworkId"); + doReturn(Optional.of(mockFrameworkEntity)).when(repository).findById("frameworkId"); Optional returned = service.findById("frameworkId"); Assertions.assertTrue(returned.isPresent(), "Classification framework was not found"); - Assertions.assertSame(returned.get(), mockFramework, "Classification framework should be the same"); + Assertions.assertEquals(returned.get().getId(), mockFrameworkEntity.getId(), "Classification framework should have the same id"); + Assertions.assertEquals(returned.get().getName(), mockFrameworkEntity.getName(), "Classification framework should have the same name"); + Assertions.assertEquals(returned.get().getTechnologyType(), mockFrameworkEntity.getTechnologyType(), "Classification framework should be of the same technology type"); + Assertions.assertEquals(returned.get().getFrameworkViews().size(), mockFrameworkEntity.getFrameworkViews().size(), "Classification framework should have the same number of views"); } @Test diff --git a/src/test/java/org/faastener/core/services/TechnologyServiceTest.java b/src/test/java/org/faastener/core/services/TechnologyServiceTest.java index 81f4e2e..f6e2595 100644 --- a/src/test/java/org/faastener/core/services/TechnologyServiceTest.java +++ b/src/test/java/org/faastener/core/services/TechnologyServiceTest.java @@ -1,6 +1,10 @@ package org.faastener.core.services; +import java.util.HashMap; + import org.faastener.core.repositories.TechnologyDossierRepository; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -19,8 +23,8 @@ class TechnologyServiceTest { private TechnologyDossierRepository repository; /*@Test - @DisplayName("Test findById - Success") - void testFindByIdSuccess() { + @DisplayName("Test findTechnologyById - Success") + void testFindTechnologyByIdSuccess() { Map>> mockReview = new HashMap<>(); List> mockReviewEntries = new ArrayList<>(); mockReviewEntries.add(new TechnologyReviewEntry<>(null, "comment", "entry_value")); diff --git a/src/test/resources/data/cu2-td-azurefunctions.json b/src/test/resources/data/cu2-td-azurefunctions.json new file mode 100644 index 0000000..770758c --- /dev/null +++ b/src/test/resources/data/cu2-td-azurefunctions.json @@ -0,0 +1,138 @@ +{ + "id": "azure-functions-dossier", + "technologyId": "azure-functions", + "reviewDate": "2021-02-12", + "reviewedCriteria": { + "license": [ { "value": "SLA for Azure Functions", "references": [ "https://azure.microsoft.com/en-gb/support/legal/sla/functions/v1_1/" ] } ], + "licenseType": [ { "value": "proprietary" } ], + "installType": [ + { "value": "installable", "references": [ "https://github.com/Azure/Azure-Functions/#github-repositories", "https://docs.microsoft.com/azure/azure-functions/functions-run-local"] }, + { "value": "as-a-service", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-scale" ] } + ], + "installTargets": [ + { "value": "Linux", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-run-local" ] }, + { "value": "Kubernetes", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-run-local" ] }, + { "value": "MacOS", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-run-local" ] }, + { "value": "Windows", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-run-local" ] } + ], + "code": [ { "value": "open source", "references": [ "https://github.com/Azure/Azure-Functions/#github-repositories" ], "comment": "Partially open sourced" } ], + "codeLoc": [ { "value": "GitHub", "references": [ "https://github.com/Azure/azure-functions-host" ] } ], + "developedIn": [ { "value": "C#", "references": [ "https://github.com/Azure/azure-functions-host/search?l=c%23" ] } ], + "interfaces": [ + { "value": "CLI", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-create-first-azure-function-azure-cli" ] }, + { "value": "API", "references": [ "https://docs.microsoft.com/rest/api/azure" ] }, + { "value": "GUI", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-create-first-azure-function" ] } + ], + "interfaceAppMgmt": [ + { "value": "create", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-create-first-azure-function-azure-cli" ] }, + { "value": "retrieve", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-create-first-azure-function-azure-cli" ] }, + { "value": "update", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-create-first-azure-function-azure-cli" ] }, + { "value": "delete", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-create-first-azure-function-azure-cli" ] } + ], + "interfaceAdmin": [], + "githubStars": [ { "value": 1300, "references": [ "https://github.com/Azure/azure-functions-host/stargazers" ] } ], + "githubForks": [ { "value": 279, "references": [ "https://github.com/Azure/azure-functions-host/network/members" ] } ], + "githubIssues": [ { "value": 948, "references": [ "https://github.com/Azure/azure-functions-host/issues" ] } ], + "githubCommits": [ { "value": 2339, "references": [ "https://github.com/Azure/azure-functions-host" ] } ], + "githubContributors": [ { "value": 60, "references": [ "https://github.com/Azure/azure-functions-host" ] } ], + "soQuestions": [ { "value": 7200, "references": [ "https://api.stackexchange.com/2.2/questions?&filter=total&site=stackoverflow&tagged=azure-functions" ] } ], + "docs": [ + { "value": "usage", "references": [ "https://docs.microsoft.com/en-us/cli/azure/functionapp" ] }, + { "value": "deployment", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-run-local" ] } + ], + "docFunctions": [ + { "value": "development", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-reference" ] }, + { "value": "deployment", "references": [ "https://docs.microsoft.com/cli/azure/functionapp/deployment" ] } + ], + "funcRuntimes": [ + { "value": "Docker", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-create-function-linux-custom-image" ] }, + { "value": "C#", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-csharp" ] }, + { "value": "JavaScript", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-node?tabs=v2#node-version" ] }, + { "value": "F#", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-fsharp" ] }, + { "value": "Java", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-java?tabs=bash%2Cconsumption" ] }, + { "value": "Powershell", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-powershell?tabs=portal" ] }, + { "value": "Python", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-python#python-version" ] }, + { "value": "TypeScript", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-node?tabs=v2#typescript" ] } + ], + "runtimeCustomization": [ { "value": true, "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-create-function-linux-custom-image", "https://github.com/Azure/azure-functions-host/wiki/Language-Extensibility" ] } ], + "ide": [ + { "value": "Visual Studio", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-develop-local" ] }, + { "value": "Visual Studio Code", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-develop-local" ] } + ], + "clientLibs": [ + { "value": "Java", "references": [ "https://docs.microsoft.com/en-us/java/api/overview/azure/readme?view=azure-java-stable" ] }, + { "value": ".NET", "references": [ "https://docs.microsoft.com/en-us/dotnet/api/overview/azure/functions?view=azure-dotnet" ] }, + { "value": "Python", "references": [ "https://docs.microsoft.com/en-us/python/api/overview/azure/functions?view=azure-python" ] } + ], + "pkgSizeQuotas": [ { "value": true, "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-scale" ] } ], + "execTimeQuotas": [ { "value": true, "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-scale" ], "comment": "Execution time can be set to be unlimited" } ], + "versioning": [ { "value": "implicit", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-reference" ] } ], + "appVersioning": [ { "value": "implicit", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-reference" ] } ], + "endpointSyncCall": [ { "value": "HTTP", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-bindings-http-webhook" ] } ], + "endpointAsyncCall": [], + "endpointCustomization": [ { "value": true, "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-http-webhook-trigger?tabs=csharp#customize-the-http-endpoint" ] } ], + "endpointTLS": [ { "value": true, "references": [ "https://docs.microsoft.com/azure/app-service/app-service-web-configure-tls-mutual-auth" ] } ], + "datastoreBlob": [ { "value": "Azure Blob Storage", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-create-storage-blob-triggered-function" ] } ], + "datastoreDB": [ + { "value": "Azure Cosmos DB", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-create-cosmos-db-triggered-function" ] }, + { "value": "Azure Tables", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-table" ] } + ], + "scheduler": [ { "value": true, "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-create-scheduled-function" ] } ], + "messaging": [ + { "value": "Azure Queue Storage", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-create-storage-queue-triggered-function" ] }, + { "value": "Azure Service Bus", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-bindings-service-bus" ] }, + { "value": "RabbitMQ", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-rabbitmq" ] } + ], + "streaming": [ + { "value": "Azure Event Hubs", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-bindings-event-hubs" ] }, + { "value": "Apache Kafka", "references": [ "https://github.com/azure/azure-functions-kafka-extension" ] } + ], + "specService": [ + { "value": "Azure Event Grid", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-event-grid" ] }, + { "value": "Azure IoT Hub", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-event-iot" ] }, + { "value": "Azure Mobile Apps", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-mobile-apps" ], "comment": "Only available to Azure Functions 1.x" }, + { "value": "Azure Notification Hubs", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-notification-hubs" ] }, + { "value": "Azure SignalR Service", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-signalr-service" ] }, + { "value": "SendGrid", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-sendgrid?tabs=csharp" ] }, + { "value": "Twilio", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-twilio?tabs=csharp" ] } + ], + "eventSourceIntegration": [ { "value": "custom I/O bindings", "references": [ "https://github.com/Azure/azure-webjobs-sdk/wiki/Creating-custom-input-and-output-bindings" ] } ], + "orchestrator": [ { "value": "Azure Durable Functions", "references": [ "https://docs.microsoft.com/azure/azure-functions/durable/durable-functions-orchestrations" ] } ], + "workflowDefType": [ { "value": "orchestrating function", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-types-features-overview#orchestrator-functions" ] } ], + "workflowDefLang": [ + { "value": "C#", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-create-first-csharp?pivots=code-editor-vscode" ] }, + { "value": "JavaScript", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/durable/quickstart-js-vscode" ] }, + { "value": "Python", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/durable/quickstart-python-vscode" ] }, + { "value": "Powershell", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/durable/quickstart-powershell-vscode" ] } + ], + "controlFlowDocs": [ { "value": true, "references": [ "https://docs.microsoft.com/azure/azure-functions/durable/durable-functions-code-constraints" ] } ], + "orchExecTimeQuotas": [ { "value": false, "references": [] } ], + "orchIOQuotas": [ { "value": false, "references": [] } ], + "testingFunc": [ { "value": "via external tools", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-test-a-function" ], "comment": "Only guidelines are provided" } ], + "testingNonFunc": [], + "debuggingLocal": [ { "value": "step-through debugging", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-debug-powershell-local" ], "comment": "Using dedicated functions development framework" } ], + "debuggingRemote": [], + "logging": [ { "value": "Azure Application Insights", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-monitoring" ] } ], + "monitoring": [ { "value": "Azure Application Insights", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-monitoring" ] } ], + "obsIntegration": [], + "depAutomation": [ { "value": "Azure Resource Manager", "references": [ "https://docs.microsoft.com/azure/azure-functions/functions-how-to-azure-devops" ] } ], + "cicd": [ + { "value": "Azure Pipelines", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/functions-how-to-azure-devops?tabs=csharp" ] }, + { "value": "Azure App Service", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/functions-continuous-deployment" ] }, + { "value": "Jenkins", "references": [ "https://docs.microsoft.com/en-us/azure/developer/jenkins/deploy-to-azure-functions?toc=https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fazure%2Fazure-functions%2Ftoc.json&bc=https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fazure%2Fbread%2Ftoc.json" ] } + ], + "funcMarketplaces": [], + "funcSampleRepos": [ { "value": true, "references": [ "https://github.com/Azure/Azure-Functions/wiki/Samples-and-content" ] } ], + "auth": [ + { "value": "Azure Active Directory", "references": [ "https://docs.microsoft.com/azure/app-service/configure-authentication-provider-aad" ] }, + { "value": "Facebook", "references": [ "https://docs.microsoft.com/azure/app-service/configure-authentication-provider-facebook" ] }, + { "value": "Google", "references": [ "https://docs.microsoft.com/azure/app-service/configure-authentication-provider-google" ] }, + { "value": "Microsoft account", "references": [ "https://docs.microsoft.com/azure/app-service/configure-authentication-provider-microsoft" ] }, + { "value": "Twitter", "references": [ "https://docs.microsoft.com/azure/app-service/configure-authentication-provider-twitter" ] } + ], + "accessControl": [ + { "value": "resources", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/security-concepts" ] }, + { "value": "functions", "references": [ "https://docs.microsoft.com/en-us/azure/azure-functions/security-concepts" ] } + ] + } +} diff --git a/src/test/resources/data/cu2-td-fission.json b/src/test/resources/data/cu2-td-fission.json new file mode 100644 index 0000000..a9fd68c --- /dev/null +++ b/src/test/resources/data/cu2-td-fission.json @@ -0,0 +1,110 @@ +{ + "id": "fission-dossier", + "technologyId": "fission", + "reviewDate": "2021-02-12", + "reviewedCriteria": { + "license": [ { "value": "Apache 2.0", "references": [ "https://github.com/fission/fission/blob/master/LICENSE" ] } ], + "licenseType": [ { "value": "permissive" } ], + "installType": [ { "value": "installable", "references": [ "https://docs.fission.io/installation/" ] } ], + "installTargets": [ { "value": "Kubernetes", "references": [ "https://docs.fission.io/docs/installation/" ] } ], + "code": [ { "value": "open source", "references": [ "https://github.com/fission/fission/blob/master/LICENSE" ] } ], + "codeLoc": [ { "value": "GitHub", "references": [ "https://github.com/fission/fission" ] } ], + "developedIn": [ { "value": "Go", "references": [ "https://github.com/fission/fission/search?l=go" ] } ], + "interfaces": [ + { "value": "CLI", "references": [ "https://docs.fission.io/docs/installation/#install-fission-cli" ] }, + { "value": "API", "references": [ "https://docs.fission.io/docs/concepts/components/core/controller/#api" ] } + ], + "interfaceAppMgmt": [ + { "value": "create", "references": [ "https://docs.fission.io/docs/concepts/components/core/controller/#api" ] }, + { "value": "retrieve", "references": [ "https://docs.fission.io/docs/concepts/components/core/controller/#api" ] }, + { "value": "update", "references": [ "https://docs.fission.io/docs/concepts/components/core/controller/#api" ] }, + { "value": "delete", "references": [ "https://docs.fission.io/docs/concepts/components/core/controller/#api" ] } + ], + "interfaceAdmin": [ + { "value": "deployment", "references": [ "https://github.com/fission/fission/blob/master/charts/README.md" ] }, + { "value": "configuration", "references": [ "https://github.com/fission/fission/tree/master/charts#configuration" ] }, + { "value": "enactment", "references": [ "https://github.com/fission/fission/blob/master/charts/README.md" ] } + ], + "githubStars": [ { "value": 5200, "references": [ "https://github.com/fission/fission/stargazers" ] } ], + "githubForks": [ { "value": 487, "references": [ "https://github.com/fission/fission/network/members" ] } ], + "githubIssues": [ { "value": 215, "references": [ "https://github.com/fission/fission/issues" ] } ], + "githubCommits": [ { "value": 1156, "references": [ "https://github.com/fission/fission" ] } ], + "githubContributors": [ { "value": 104, "references": [ "https://github.com/fission/fission" ] } ], + "soQuestions": [ { "value": 7, "references": [ "https://api.stackexchange.com/2.2/questions?&filter=total&site=stackoverflow&tagged=kubernetes-fission" ] } ], + "docs": [ + { "value": "usage", "references": [ "https://docs.fission.io/docs/usage" ] }, + { "value": "development", "references": [ "https://docs.fission.io/docs/contributing" ] }, + { "value": "deployment", "references": [ "https://docs.fission.io/docs/installation" ] }, + { "value": "architecture", "references": [ "https://github.com/fission/fission/blob/master/Documentation/Architecture.md" ] } + ], + "docFunctions": [ + { "value": "development", "references": [ "https://docs.fission.io/docs/usage/functions/" ] }, + { "value": "deployment", "references": [ "https://docs.fission.io/docs/spec/" ] } + ], + "funcRuntimes": [ + { "value": "Binary", "references": [ "https://docs.fission.io/docs/languages" ] }, + { "value": "C#", "references": [ "https://docs.fission.io/docs/languages" ] }, + { "value": "Go", "references": [ "https://docs.fission.io/docs/languages/go" ] }, + { "value": "Java", "references": [ "https://docs.fission.io/docs/languages/java" ] }, + { "value": "Node.js", "references": [ "https://docs.fission.io/docs/languages/nodejs" ] }, + { "value": "Perl", "references": [ "https://docs.fission.io/docs/languages" ] }, + { "value": "PHP", "references": [ "https://docs.fission.io/docs/languages" ] }, + { "value": "Python", "references": [ "https://docs.fission.io/docs/languages/python" ] }, + { "value": "Ruby", "references": [ "https://docs.fission.io/docs/languages" ] }, + { "value": "Shell", "references": [ "https://github.com/fission/fission/tree/master/environments/binary" ] } + ], + "runtimeCustomization": [ { "value": true, "references": [ "https://docs.fission.io/docs/concepts/#environments" ] } ], + "ide": [], + "clientLibs": [], + "pkgSizeQuotas": [ { "value": false, "references": [] } ], + "execTimeQuotas": [ { "value": false, "references": [] } ], + "versioning": [ { "value": "implicit", "references": [ "https://docs.fission.io/docs/usage/package/" ], "comment": "Package can group multiple functions and be implicitly versioned" } ], + "appVersioning": [ { "value": "implicit", "references": [ "https://docs.fission.io/docs/usage/canary-deployments" ], "comment": "Versions can be encoded as in canary deployment spec" } ], + "endpointSyncCall": [ { "value": "HTTP", "references": [ "https://docs.fission.io/docs/triggers/http-trigger/"] } ], + "endpointAsyncCall": [], + "endpointCustomization": [ { "value": true, "references": [ "https://docs.fission.io/docs/triggers/http-trigger/" ] } ], + "endpointTLS": [ { "value": true, "references": [ "https://docs.fission.io/docs/installation/advanced-setup/#setup-ssltls-for-functions" ] } ], + "datastoreBlob": [], + "datastoreDB": [], + "scheduler": [ { "value": true, "references": [ "https://docs.fission.io/docs/triggers/timer" ] } ], + "messaging": [ + { "value": "NATS Streaming", "references": [ "https://docs.fission.io/docs/triggers/message-queue-trigger/nats-streaming" ] }, + { "value": "Azure Storage Queue", "references": [ "https://docs.fission.io/docs/triggers/message-queue-trigger" ] }, + { "value": "AWS SQS", "references": [ "https://docs.fission.io/docs/triggers/message-queue-trigger-kind-keda/aws-sqs" ] } + ], + "streaming": [ + { "value": "Apache Kafka", "references": [ "https://docs.fission.io/docs/triggers/message-queue-trigger/kafka/" ] }, + { "value": "AWS Kinesis", "references": [ "https://docs.fission.io/docs/triggers/message-queue-trigger-kind-keda/aws-kinesis" ] } + ], + "specService": [ + { "value": "KubeWatcher", "references": [ "https://docs.fission.io/docs/concepts/components/optional/kubewatcher" ] } + ], + "eventSourceIntegration": [ + { "value": "plugin-based", "references": [ "https://docs.fission.io/docs/triggers/message-queue-trigger/#how-to-add-new-message-queue-support" ] } + ], + "orchestrator": [ { "value": "Fission Workflows", "references": [ "https://docs.fission.io/docs/workflows" ] } ], + "workflowDefType": [ { "value": "custom DSL", "references": [ "https://docs.fission.io/docs/workflows/#creating-your-first-workflow" ] } ], + "workflowDefLang": [], + "controlFlowDocs": [ { "value": true, "references": [ "https://github.com/fission/fission-workflows/blob/master/Docs/functions.md" ] } ], + "orchExecTimeQuotas": [ { "value": false, "references": [] } ], + "orchIOQuotas": [ { "value": false, "references": [] } ], + "testingFunc": [ { "value": "function invocation testing", "references": [ "https://docs.fission.io/docs/usage/functions/#test-and-debug-function" ] } ], + "testingNonFunc": [], + "debuggingLocal": [ { "value": "log-based debugging", "references": [ "https://docs.fission.io/docs/usage/functions/#test-and-debug-function" ] } ], + "debuggingRemote": [], + "logging": [ + { "value": "Fission Logger + InfluxDB", "references": [ "https://docs.fission.io/docs/concepts/components/optional/logger" ] }, + { "value": "Istio + Jaeger", "references": [ "https://docs.fission.io/docs/usage/enabling-istio-on-fission/#jaeger" ] } + ], + "monitoring": [ + { "value": "Istio + Prometheus", "references": [ "https://docs.fission.io/docs/usage/enabling-istio-on-fission/#prometheus" ] } + ], + "obsIntegration": [ { "value": "Via service mesh add-ons", "references": [ "https://docs.fission.io/docs/usage/enabling-istio-on-fission/#install-istio-add-ons" ] } ], + "depAutomation": [ { "value": "Fission CLI", "references": [ "https://docs.fission.io/docs/spec/#apply-deploy-your-functions-to-fission" ] } ], + "cicd": [], + "funcMarketplaces": [], + "funcSampleRepos": [ { "value": true, "references": [ "https://github.com/fission/fission/tree/master/examples" ] } ], + "auth": [ { "value": "Via Kubernetes mechanisms", "references": [ "https://docs.fission.io/docs/usage/access-secret-cfgmap-in-function/" ] } ], + "accessControl": [] + } +} diff --git a/src/test/resources/data/cu2-td-fn.json b/src/test/resources/data/cu2-td-fn.json new file mode 100644 index 0000000..5fdd9d7 --- /dev/null +++ b/src/test/resources/data/cu2-td-fn.json @@ -0,0 +1,105 @@ +{ + "id": "fn-project-dossier", + "technologyId": "fn-project", + "reviewDate": "2021-02-12", + "reviewedCriteria": { + "license": [ { "value": "Apache 2.0", "references": [ "https://github.com/fnproject/docs/blob/master/LICENSE" ] } ], + "licenseType": [ { "value": "permissive" } ], + "installType": [ { "value": "installable", "references": [ "https://fnproject.io/tutorials/install" ] } ], + "installTargets": [ + { "value": "Docker", "references": [ "https://fnproject.io/tutorials/install/" ] }, + { "value": "Linux", "references": [ "https://fnproject.io/tutorials/install/" ] }, + { "value": "Unix", "references": [ "https://fnproject.io/tutorials/install/" ] }, + { "value": "MacOS", "references": [ "https://fnproject.io/tutorials/install/" ] }, + { "value": "Windows", "references": [ "https://fnproject.io/tutorials/install/" ] } + ], + "code": [ { "value": "open source", "references": [ "https://github.com/fnproject/fn" ] } ], + "codeLoc": [ { "value": "GitHub", "references": [ "https://github.com/fnproject/fn" ] } ], + "developedIn": [ { "value": "Go", "references": [ "https://github.com/fnproject/fn/search?l=go" ] } ], + "interfaces": [ + { "value": "CLI", "references": [ "https://github.com/fnproject/cli" ] }, + { "value": "API", "references": [ "https://github.com/fnproject/docs/blob/master/fn/develop/README.md#advanced" ] }, + { "value": "GUI", "references": [ "https://github.com/fnproject/ui" ] } + ], + "interfaceAppMgmt": [ + { "value": "create", "references": [ "https://github.com/fnproject/docs/blob/master/cli/README.md" ] }, + { "value": "retrieve", "references": [ "https://github.com/fnproject/docs/blob/master/cli/README.md" ] }, + { "value": "update", "references": [ "https://github.com/fnproject/docs/blob/master/cli/README.md" ] }, + { "value": "delete", "references": [ "https://github.com/fnproject/docs/blob/master/cli/README.md" ] } + ], + "interfaceAdmin": [ + { "value": "deployment", "references": [ "https://fnproject.io/tutorials/install" ] }, + { "value": "configuration", "references": [ "https://github.com/fnproject/docs/blob/master/cli/README.md" ] }, + { "value": "enactment", "references": [ "https://github.com/fnproject/docs/blob/master/cli/README.md" ] }, + { "value": "termination", "references": [ "https://github.com/fnproject/docs/blob/master/cli/ref/fn-stop.md" ] } + ], + "githubStars": [ { "value": 4900, "references": [ "https://github.com/fnproject/fn/stargazers" ] } ], + "githubForks": [ { "value": 363, "references": [ "https://github.com/fnproject/fn/network/members" ] } ], + "githubIssues": [ { "value": 128, "references": [ "https://github.com/fnproject/fn/issues" ] } ], + "githubCommits": [ { "value": 3393, "references": [ "https://github.com/fnproject/fn/commits/master" ] } ], + "githubContributors": [ { "value": 86, "references": [ "https://github.com/fnproject/fn/graphs/contributors" ] } ], + "soQuestions": [ { "value": 30, "references": [ "https://api.stackexchange.com/2.2/questions?&filter=total&site=stackoverflow&tagged=fn" ] } ], + "docs": [ + { "value": "usage", "references": [ "https://github.com/fnproject/docs#getting-started" ] }, + { "value": "development", "references": [ "https://github.com/fnproject/docs#for-contributors" ] }, + { "value": "deployment", "references": [ "https://fnproject.io/tutorials/install/" ] }, + { "value": "architecture", "references": [ "https://github.com/fnproject/docs/blob/master/fn/general/introduction.md#the-fn-architecture" ] } + ], + "docFunctions": [ + { "value": "development", "references": [ "https://github.com/fnproject/docs/blob/master/fn/general/introduction.md#functions-with-fn" ] }, + { "value": "deployment", "references": [ "https://github.com/fnproject/docs/blob/master/fn/general/introduction.md#functions-with-fn" ] } + ], + "funcRuntimes": [ + { "value": "Go", "references": [ "https://fnproject.io/tutorials/Introduction/" ] }, + { "value": "Java", "references": [ "https://fnproject.io/tutorials/JavaFDKIntroduction/" ] }, + { "value": "Node.js", "references": [ "https://fnproject.io/tutorials/node/intro/" ] }, + { "value": "C#", "references": [ "https://fnproject.io/tutorials/csharp/intro/" ] }, + { "value": "Python", "references": [ "https://fnproject.io/tutorials/python/intro/" ] }, + { "value": "Ruby", "references": [ "https://fnproject.io/tutorials/ruby/intro/" ] }, + { "value": "Docker", "references": [ "https://fnproject.io/tutorials/ContainerAsFunction/" ] } + ], + "runtimeCustomization": [ { "value": true, "references": [ "https://github.com/fnproject/docs/blob/master/fn/develop/fdks.md#bring-your-own-container" ] } ], + "ide": [], + "clientLibs": [ { "value": "Go", "references": [ "https://github.com/fnproject/fn_go" ] } ], + "pkgSizeQuotas": [ { "value": false, "references": [] } ], + "execTimeQuotas": [ { "value": false, "references": [] } ], + "versioning": [ { "value": "dedicated mechanisms", "references": [ "https://github.com/fnproject/docs/blob/master/fn/develop/func-file.md" ], "comment": "Version property is appended as a tag to the function image" } ], + "appVersioning": [ { "value": "implicit", "references": [ "https://github.com/fnproject/docs/blob/master/fn/develop/apps.md#applications" ], "comment": "" } ], + "endpointSyncCall": [ { "value": "HTTP", "references": [ "https://github.com/fnproject/docs/blob/master/fn/develop/triggers.md"] } ], + "endpointAsyncCall": [], + "endpointCustomization": [ { "value": true, "references": [ "https://github.com/fnproject/docs/blob/master/fn/develop/triggers.md" ] } ], + "endpointTLS": [ { "value": false, "references": [] } ], + "datastoreBlob": [], + "datastoreDB": [], + "scheduler": [ { "value": false, "references": [] } ], + "messaging": [], + "streaming": [], + "specService": [], + "eventSourceIntegration": [], + "orchestrator": [ { "value": "FnFlows", "references": [ "https://github.com/fnproject/fdk-java/blob/master/docs/FnFlowsUserGuide.md" ] } ], + "workflowDefType": [ { "value": "orchestrating function", "references": [ "https://github.com/fnproject/flow#writing-flow-functions" ] } ], + "workflowDefLang": [{ "value": "Java", "references": [ "https://github.com/fnproject/fdk-java/blob/master/docs/FnFlowsUserGuide.md" ] } ], + "controlFlowDocs": [ { "value": true, "references": [ "https://github.com/fnproject/flow/blob/master/docs/API.md#completion-stage-types" ] } ], + "orchExecTimeQuotas": [ { "value": false, "references": [] } ], + "orchIOQuotas": [ { "value": false, "references": [] } ], + "testingFunc": [ { "value": "unit testing", "references": [ "https://github.com/fnproject/docs/blob/master/fdks/fdk-java/TestingFunctions.md" ], "comment": "For Java only" } ], + "testingNonFunc": [], + "debuggingLocal": [ { "value": "log-based debugging", "references": [ "https://fnproject.io/tutorials/Troubleshooting/" ], "comment": "Using Fn CLI" } ], + "debuggingRemote": [], + "logging": [ + { "value": "Docker container logs", "references": [ "https://github.com/fnproject/docs/blob/master/fn/operate/logging.md" ] } + ], + "monitoring": [ + { "value": "Jaeger", "references": [ "https://github.com/fnproject/docs/blob/master/fn/operate/metrics.md" ] }, + { "value": "Prometheus", "references": [ "https://github.com/fnproject/docs/blob/master/fn/operate/metrics.md" ] }, + { "value": "Zipkin", "references": [ "https://github.com/fnproject/docs/blob/master/fn/operate/metrics.md" ] } + ], + "obsIntegration": [ { "value": "push-based", "references": [ "https://github.com/fnproject/tutorials/blob/master/Troubleshooting/README.md#log-capture-to-a-logging-service" ] } ], + "depAutomation": [ { "value": "Fn CLI", "references": [ "https://github.com/fnproject/docs/blob/master/fn/develop/packaging.md#option-1-recommended-use-the-fn-cli-tool" ] } ], + "cicd": [], + "funcMarketplaces": [], + "funcSampleRepos": [ { "value": true, "references": [ "https://github.com/fnproject/tutorials" ] } ], + "auth": [], + "accessControl": [] + } +} diff --git a/src/test/resources/data/cu2-td-gcf.json b/src/test/resources/data/cu2-td-gcf.json new file mode 100644 index 0000000..c1d6223 --- /dev/null +++ b/src/test/resources/data/cu2-td-gcf.json @@ -0,0 +1,112 @@ +{ + "id": "google-cloud-functions-dossier", + "technologyId": "google-cloud-functions", + "reviewDate": "2021-02-12", + "reviewedCriteria": { + "license": [ { "value": "Google Cloud Platform Terms", "references": [ "https://cloud.google.com/terms" ] } ], + "licenseType": [ { "value": "proprietary" } ], + "installType": [ { "value": "as-a-service", "references": [ "https://cloud.google.com/functions/docs/concepts/overview" ] } ], + "installTargets": [], + "code": [ { "value": "closed source", "references": [] } ], + "codeLoc": [], + "developedIn": [], + "interfaces": [ + { "value": "CLI", "references": [ "https://cloud.google.com/sdk/gcloud/reference/functions/" ] }, + { "value": "API", "references": [ "https://cloud.google.com/functions/docs/apis" ] }, + { "value": "GUI", "references": [ "https://console.cloud.google.com/functions" ] } + ], + "interfaceAppMgmt": [ + { "value": "create", "references": [ "https://cloud.google.com/functions/docs/reference/rest" ] }, + { "value": "retrieve", "references": [ "https://cloud.google.com/functions/docs/reference/rest" ] }, + { "value": "update", "references": [ "https://cloud.google.com/functions/docs/reference/rest" ] }, + { "value": "delete", "references": [ "https://cloud.google.com/functions/docs/reference/rest" ] } + ], + "interfaceAdmin": [], + "githubStars": [], + "githubForks": [], + "githubIssues": [], + "githubCommits": [], + "githubContributors": [], + "soQuestions": [ { "value": 12386, "references": [ "https://api.stackexchange.com/2.2/questions?&filter=total&site=stackoverflow&tagged=google-cloud-functions" ] } ], + "docs": [ + { "value": "usage", "references": [ "https://cloud.google.com/functions/docs/" ] } + ], + "docFunctions": [ + { "value": "development", "references": [ "https://cloud.google.com/functions/docs/" ] }, + { "value": "deployment", "references": [ "https://cloud.google.com/functions/docs/" ] } + ], + "funcRuntimes": [ + { "value": "Go", "references": [ "https://cloud.google.com/functions/docs/concepts/go-runtime" ] }, + { "value": "Java", "references": [ "https://cloud.google.com/functions/docs/concepts/java-runtime" ] }, + { "value": "Node.js", "references": [ "https://cloud.google.com/functions/docs/concepts/nodejs-10-runtime" ] }, + { "value": "Python", "references": [ "https://cloud.google.com/functions/docs/concepts/python-runtime" ] } + ], + "runtimeCustomization": [ { "value": false, "references": [] } ], + "ide": [], + "clientLibs": [ + { "value": "Go", "references": [ "https://godoc.org/google.golang.org/api/cloudfunctions" ] }, + { "value": "Java", "references": [ "https://github.com/googleapis/google-api-java-client-services#supported-google-apis" ] }, + { "value": "Node.js", "references": [ "https://github.com/googleapis/google-api-nodejs-client" ] }, + { "value": "Python", "references": [ "https://github.com/googleapis/google-api-python-client/blob/master/docs/dyn/index.md#cloudfunctions" ] }, + { "value": "C#", "references": [ "https://developers.google.com/api-client-library/dotnet/apis/cloudfunctions/v1" ] }, + { "value": "Ruby", "references": [ "https://googleapis.dev/ruby/google-api-client/latest/Google/Apis/CloudfunctionsV1.html" ] }, + { "value": "Dart", "references": [ "https://pub.dev/packages/googleapis#available-google-apis" ] } + ], + "pkgSizeQuotas": [ { "value": true, "references": [ "https://cloud.google.com/functions/quotas" ] } ], + "execTimeQuotas": [ { "value": true, "references": [ "https://cloud.google.com/functions/docs/concepts/exec#timeout" ] } ], + "versioning": [ { "value": "implicit", "references": [ "https://cloud.google.com/functions/docs/reference/rest/v1/projects.locations.functions#CloudFunction" ], "comment": "versionId is used only as output" } ], + "appVersioning": [ { "value": "implicit", "references": [ "https://cloud.google.com/sdk/gcloud/reference/projects" ], "comment": "In GCP resources are grouped by projects, but no details on explicit project versioning" } ], + "endpointSyncCall": [ + { "value": "HTTP", "references": [ "https://cloud.google.com/functions/docs/calling/direct", "https://cloud.google.com/functions/docs/calling/http" ] }, + { "value": "RPC", "references": [ "https://cloud.google.com/functions/docs/reference/rpc/google.cloud.functions.v1#google.cloud.functions.v1.CloudFunctionsService"], "comment": "for testing" } + ], + "endpointAsyncCall": [], + "endpointCustomization": [ { "value": true, "references": [ "https://cloud.google.com/endpoints/docs/openapi/get-started-cloud-functions#endpoints_configure" ] } ], + "endpointTLS": [ { "value": true, "references": [ "https://cloud.google.com/endpoints/docs/openapi/enabling-ssl" ] } ], + "datastoreBlob": [ { "value": "Google Cloud Storage", "references": [ "https://cloud.google.com/functions/docs/calling/storage" ] } ], + "datastoreDB": [ + { "value": "Cloud Firestore", "references": [ "https://cloud.google.com/functions/docs/calling/cloud-firestore" ] }, + { "value": "Firebase Realtime Database", "references": [ "https://cloud.google.com/functions/docs/calling/realtime-database" ] } + ], + "scheduler": [ { "value": true, "references": [ "https://cloud.google.com/scheduler/docs/tut-pub-sub" ] } ], + "messaging": [ { "value": "Google Cloud Pub/Sub", "references": [ "https://cloud.google.com/functions/docs/calling/pubsub" ] } ], + "streaming": [ { "value": "Google Cloud Pub/Sub", "references": [ "https://cloud.google.com/functions/docs/calling/pubsub" ] } ], + "specService": [ + { "value": "Google Analytics for Firebase", "references": [ "https://cloud.google.com/functions/docs/calling/google-analytics-firebase" ] }, + { "value": "Firebase Authentication", "references": [ "https://cloud.google.com/functions/docs/calling/firebase-auth" ] }, + { "value": "Firebase Remote Config", "references": [ "https://cloud.google.com/functions/docs/calling/firebase-remote-config" ] }, + { "value": "Cloud Logging", "references": [ "https://cloud.google.com/functions/docs/calling#cloud_logging" ] }, + { "value": "Gmail", "references": [ "https://cloud.google.com/functions/docs/calling#gmail" ] } + ], + "eventSourceIntegration": [ + { "value": "webhooks", "references": [ "https://cloud.google.com/functions/docs/calling" ] }, + { "value": "messaging-based", "references": [ "https://cloud.google.com/functions/docs/calling/logging" ] } + ], + "orchestrator": [], + "workflowDefType": [], + "workflowDefLang": [], + "controlFlowDocs": [], + "orchExecTimeQuotas": [], + "orchIOQuotas": [], + "testingFunc": [ { "value": "via external tools", "references": [ "https://cloud.google.com/functions/docs/bestpractices/testing" ], "comment": "guidelines only" } ], + "testingNonFunc": [], + "debuggingLocal": [ { "value": "step-through debugging", "references": [ "https://cloud.google.com/functions/docs/functions-framework" ], "comment": "Using dedicated functions development framework" } ], + "debuggingRemote": [], + "logging": [ + { "value": "Google Cloud Operations", "references": [ "https://cloud.google.com/functions/docs/monitoring/logging" ] } + ], + "monitoring": [ + { "value": "Google Cloud Operations", "references": [ "https://cloud.google.com/functions/docs/monitoring/metrics" ] } + ], + "obsIntegration": [], + "depAutomation": [ { "value": "Google Cloud Deployment Manager", "references": [ "https://cloud.google.com/deployment-manager/docs/configuration/supported-gcp-types" ] } ], + "cicd": [ { "value": "CloudBuild", "references": [ "https://cloud.google.com/functions/docs/testing/test-cicd" ] } ], + "funcMarketplaces": [], + "funcSampleRepos": [ { "value": true, "references": [ "https://cloud.google.com/functions/docs/writing" ] } ], + "auth": [ { "value": "Cloud IAM", "references": [ "https://cloud.google.com/functions/docs/securing/authenticating" ] } ], + "accessControl": [ + { "value": "resources", "references": [ "https://cloud.google.com/functions/docs/securing/managing-access-iam" ] }, + { "value": "functions", "references": [ "https://cloud.google.com/functions/docs/securing/function-identity" ] } + ] + } +} diff --git a/src/test/resources/data/cu2-td-knative.json b/src/test/resources/data/cu2-td-knative.json new file mode 100644 index 0000000..0c03afe --- /dev/null +++ b/src/test/resources/data/cu2-td-knative.json @@ -0,0 +1,111 @@ +{ + "id": "knative-dossier", + "technologyId": "knative", + "reviewDate": "2021-02-12", + "reviewedCriteria": { + "license": [ { "value": "Apache 2.0", "references": [ "https://github.com/knative/serving/blob/master/LICENSE" ] } ], + "licenseType": [ { "value": "permissive" } ], + "installType": [ { "value": "installable", "references": [ "https://knative.dev/docs/install" ] } ], + "installTargets": [ + { "value": "Kubernetes", "references": [ "https://knative.dev/docs/install" ] } + ], + "code": [ { "value": "open source", "references": [ "https://github.com/knative/serving" ] } ], + "codeLoc": [ { "value": "GitHub", "references": [ "https://github.com/knative/serving" ] } ], + "developedIn": [ { "value": "Go", "references": [ "https://github.com/knative/serving/search?l=go" ] } ], + "interfaces": [ + { "value": "CLI", "references": [ "https://github.com/knative/client" ] }, + { "value": "API", "references": [ "https://github.com/knative/docs/blob/master/docs/serving/spec/knative-api-specification-1.0.md" ] } + ], + "interfaceAppMgmt": [ + { "value": "create", "references": [ "https://github.com/knative/client/blob/master/docs/cmd/kn_service.md" ] }, + { "value": "retrieve", "references": [ "https://github.com/knative/client/blob/master/docs/cmd/kn_service.md" ] }, + { "value": "update", "references": [ "https://github.com/knative/client/blob/master/docs/cmd/kn_service.md" ] }, + { "value": "delete", "references": [ "https://github.com/knative/client/blob/master/docs/cmd/kn_service.md" ] } + ], + "interfaceAdmin": [ + { "value": "deployment", "references": [ "https://knative.dev/docs/install/any-kubernetes-cluster" ] }, + { "value": "configuration", "references": [ "https://knative.dev/docs/install/any-kubernetes-cluster" ] }, + { "value": "enactment", "references": [ "https://knative.dev/docs/install/any-kubernetes-cluster" ] } + ], + "githubStars": [ { "value": 3600, "references": [ "https://github.com/knative/serving/stargazers" ] } ], + "githubForks": [ { "value": 764, "references": [ "https://github.com/knative/serving/network/members" ] } ], + "githubIssues": [ { "value": 173, "references": [ "https://github.com/knative/serving/issues" ] } ], + "githubCommits": [ { "value": 6323, "references": [ "https://github.com/knative/serving/commits/master" ] } ], + "githubContributors": [ { "value": 218, "references": [ "https://github.com/knative/serving/graphs/contributors" ] } ], + "soQuestions": [ { "value": 93, "references": [ "https://api.stackexchange.com/2.2/questions?&filter=total&site=stackoverflow&tagged=knative" ] } ], + "docs": [ + { "value": "usage", "references": [ "https://knative.dev/docs/serving" ] }, + { "value": "development", "references": [ "https://github.com/knative/serving/blob/master/DEVELOPMENT.md" ] }, + { "value": "deployment", "references": [ "https://knative.dev/docs/install/" ] } + ], + "docFunctions": [ + { "value": "deployment", "references": [ "https://knative.dev/docs/serving/getting-started-knative-app" ] } + ], + "funcRuntimes": [ + { "value": "Docker", "references": [ "https://knative.dev/docs/serving/getting-started-knative-app" ] } + ], + "runtimeCustomization": [ { "value": true, "references": [ "https://github.com/knative/serving/blob/master/docs/spec/overview.md#service" ] } ], + "ide": [], + "clientLibs": [], + "pkgSizeQuotas": [ { "value": false, "references": [] } ], + "execTimeQuotas": [ { "value": false, "references": [] } ], + "versioning": [ { "value": "dedicated mechanisms", "references": [ "https://github.com/knative/serving/blob/master/docs/spec/overview.md#revision" ], "comment": "Revision resource represents an immutable version of a function" } ], + "appVersioning": [], + "endpointSyncCall": [ { "value": "HTTP", "references": [ "https://knative.dev/docs/serving/getting-started-knative-app"] } ], + "endpointAsyncCall": [], + "endpointCustomization": [ { "value": true, "references": [ "https://knative.dev/docs/serving/samples/knative-routing-go/index.html" ] } ], + "endpointTLS": [ { "value": true, "references": [ "https://knative.dev/docs/serving/using-auto-tls" ] } ], + "datastoreBlob": [ { "value": "Google Cloud Storage", "references": [ "https://knative.dev/docs/eventing/sources/index.html" ] } ], + "datastoreDB": [ + { "value": "Apache CouchDB", "references": [ "https://knative.dev/docs/eventing/sources/index.html", "https://github.com/knative-sandbox/eventing-couchdb/tree/main/source" ] }, + { "value": "AWS DynamoDB", "references": [ "https://knative.dev/docs/eventing/sources/index.html", "https://github.com/triggermesh/aws-event-sources/blob/master/cmd/awsdynamodbsource/README.md" ] } + ], + "scheduler": [ { "value": true, "references": [ "https://knative.dev/docs/eventing/sources/index.html" ] } ], + "messaging": [ + { "value": "AWS SQS", "references": [ "https://knative.dev/docs/eventing/sources/index.html", "https://github.com/knative-sandbox/eventing-awssqs/blob/main/pkg/apis/sources/v1alpha1/aws_sqs_types.go", "https://github.com/triggermesh/aws-event-sources/blob/master/cmd/awssqssource/README.md" ] }, + { "value": "AWS SNS", "references": [ "https://knative.dev/docs/eventing/sources/index.html", "https://github.com/triggermesh/aws-event-sources/tree/master/cmd/awssnssource" ] }, + { "value": "Google Cloud PubSub", "references": [ "https://knative.dev/docs/eventing/sources/index.html", "https://github.com/google/knative-gcp/blob/main/docs/examples/cloudpubsubsource/README.md" ] }, + { "value": "RabbitMQ", "references": [ "https://knative.dev/docs/eventing/sources/index.html", "https://github.com/knative-sandbox/eventing-rabbitmq" ] } + ], + "streaming": [ + { "value": "Apache Kafka", "references": [ "https://knative.dev/docs/eventing/sources/index.html", "https://github.com/knative-sandbox/eventing-kafka/blob/master/pkg/apis/sources/v1beta1/kafka_types.go" ] }, + { "value": "AWS Kinesis", "references": [ "https://knative.dev/docs/eventing/sources/index.html", "https://github.com/triggermesh/aws-event-sources/blob/master/cmd/awskinesissource/README.md" ] }, + { "value": "Google Cloud PubSub", "references": [ "https://knative.dev/docs/eventing/sources/index.html", "https://github.com/google/knative-gcp/blob/main/docs/examples/cloudpubsubsource/README.md" ] } + ], + "specService": [ + { "value": "Apache Camel", "references": [ "https://knative.dev/docs/eventing/sources/index.html" ] }, + { "value": "Kubernetes API server events", "references": [ "https://knative.dev/docs/eventing/sources/index.html" ] }, + { "value": "GitHub", "references": [ "https://knative.dev/docs/eventing/sources/index.html" ] }, + { "value": "GitLab", "references": [ "https://knative.dev/docs/eventing/sources/index.html" ] }, + { "value": "BitBucket", "references": [ "https://knative.dev/docs/eventing/sources/index.html" ] }, + { "value": "Google Cloud Scheduler", "references": [ "https://knative.dev/docs/eventing/sources/index.html" ] }, + { "value": "AWS CodeCommit", "references": [ "https://knative.dev/docs/eventing/sources/index.html" ] }, + { "value": "AWS Cognito", "references": [ "https://knative.dev/docs/eventing/sources/index.html" ] }, + { "value": "FTP/SFTP", "references": [ "https://knative.dev/docs/eventing/sources/index.html" ] }, + { "value": "Heartbeat events", "references": [ "https://knative.dev/docs/eventing/sources/index.html" ] }, + { "value": "Websocket", "references": [ "https://knative.dev/docs/eventing/sources/index.html" ] } + ], + "eventSourceIntegration": [ {"value": "plugin-based", "references": [ "https://knative.dev/docs/eventing/samples/writing-receive-adapter-source/" ] } ], + "orchestrator": [ { "value": "Knative Eventing", "references": [ "https://knative.dev/docs/eventing/" ], "comment": "Only limited orchestration capabilities (sequence & parallel execution)" } ], + "workflowDefType": [ { "value": "custom DSL", "references": [ "https://knative.dev/docs/eventing/parallel", "https://knative.dev/docs/eventing/sequence" ] } ], + "workflowDefLang": [], + "controlFlowDocs": [ { "value": true, "references": [ "https://knative.dev/docs/eventing/flows/sequence", "https://knative.dev/docs/eventing/flows/parallel" ] } ], + "orchExecTimeQuotas": [ { "value": false, "references": [] } ], + "orchIOQuotas": [ { "value": false, "references": [] } ], + "testingFunc": [], + "testingNonFunc": [], + "debuggingLocal": [ { "value": "log-based debugging", "references": [ "https://knative.dev/docs/serving/debugging-application-issues/" ], "comment": "Using Kubernetes" } ], + "debuggingRemote": [], + "logging": [ + { "value": "Fluentbit", "references": [ "https://knative.dev/docs/install/collecting-logs" ] } + ], + "monitoring": [], + "obsIntegration": [ { "value": "push-based", "references": [ "https://knative.dev/docs/install/collecting-logs/#setting-up-the-forwarders" ] } ], + "depAutomation": [ { "value": "Kubernetes", "references": [ "https://knative.dev/docs/serving/getting-started-knative-app/" ] } ], + "cicd": [], + "funcMarketplaces": [], + "funcSampleRepos": [ { "value": true, "references": [ "https://knative.dev/docs/serving/samples/" ] } ], + "auth": [], + "accessControl": [] + } +} diff --git a/src/test/resources/data/cu2-td-kubeless.json b/src/test/resources/data/cu2-td-kubeless.json new file mode 100644 index 0000000..e318709 --- /dev/null +++ b/src/test/resources/data/cu2-td-kubeless.json @@ -0,0 +1,104 @@ +{ + "id": "kubeless-dossier", + "technologyId": "kubeless", + "reviewDate": "2021-02-12", + "reviewedCriteria": { + "license": [ { "value": "Apache 2.0", "references": [ "https://github.com/kubeless/kubeless" ] } ], + "licenseType": [ { "value": "permissive" } ], + "installType": [ { "value": "installable", "references": [ "https://kubeless.io/docs/quick-start/#installation" ] } ], + "installTargets": [ + { "value": "Kubernetes", "references": [ "https://kubeless.io/docs/quick-start/#installation" ] }, + { "value": "Linux", "references": [ "https://kubeless.io/docs/quick-start/#installation" ] }, + { "value": "Unix", "references": [ "https://kubeless.io/docs/quick-start/#installation" ] }, + { "value": "MacOS", "references": [ "https://kubeless.io/docs/quick-start/#installation" ] }, + { "value": "Windows", "references": [ "https://kubeless.io/docs/quick-start/#installation" ] } + ], + "code": [ { "value": "open source", "references": [ "https://github.com/kubeless/kubeless" ] } ], + "codeLoc": [ { "value": "GitHub", "references": [ "https://github.com/kubeless/kubeless" ] } ], + "developedIn": [ { "value": "Go", "references": [ "https://github.com/kubeless/kubeless/search?l=go" ] } ], + "interfaces": [ + { "value": "CLI", "references": [ "https://github.com/kubeless/kubeless/blob/master/docs/architecture.md#kubeless-command-line-client" ] } + ], + "interfaceAppMgmt": [ + { "value": "create", "references": [ "https://github.com/kubeless/kubeless/tree/master/cmd/kubeless" ] }, + { "value": "retrieve", "references": [ "https://github.com/kubeless/kubeless/tree/master/cmd/kubeless" ] }, + { "value": "update", "references": [ "https://github.com/kubeless/kubeless/tree/master/cmd/kubeless" ] }, + { "value": "delete", "references": [ "https://github.com/kubeless/kubeless/tree/master/cmd/kubeless" ] } + ], + "interfaceAdmin": [ + { "value": "deployment", "references": [ "https://kubeless.io/docs/quick-start/#installation" ] }, + { "value": "configuration", "references": [ "https://kubeless.io/docs/quick-start/#installation" ] }, + { "value": "enactment", "references": [ "https://kubeless.io/docs/quick-start/#installation" ] } + ], + "githubStars": [ { "value": 6400, "references": [ "https://github.com/kubeless/kubeless/stargazers" ] } ], + "githubForks": [ { "value": 678, "references": [ "https://github.com/kubeless/kubeless/network/members" ] } ], + "githubIssues": [ { "value": 183, "references": [ "https://github.com/kubeless/kubeless/issues" ] } ], + "githubCommits": [ { "value": 1038, "references": [ "https://github.com/kubeless/kubeless/commits/master" ] } ], + "githubContributors": [ { "value": 102, "references": [ "https://github.com/kubeless/kubeless/graphs/contributors" ] } ], + "soQuestions": [ { "value": 12, "references": [ "https://api.stackexchange.com/2.2/questions?&filter=total&site=stackoverflow&tagged=kubeless" ] } ], + "docs": [ + { "value": "usage", "references": [ "https://kubeless.io/docs/quick-start" ] }, + { "value": "development", "references": [ "https://kubeless.io/docs/dev-guide/" ] }, + { "value": "deployment", "references": [ "https://kubeless.io/docs/quick-start" ] }, + { "value": "architecture", "references": [ "https://kubeless.io/docs/architecture/" ] } + ], + "docFunctions": [ + { "value": "development", "references": [ "https://kubeless.io/docs/building-functions/" ] }, + { "value": "deployment", "references": [ "https://kubeless.io/docs/advanced-function-deployment/" ] } + ], + "funcRuntimes": [ + { "value": "Ballerina", "references": [ "https://kubeless.io/docs/runtimes" ] }, + { "value": "C#", "references": [ "https://kubeless.io/docs/runtimes" ] }, + { "value": "Docker Image", "references": [ "https://kubeless.io/docs/runtimes" ] }, + { "value": "Go", "references": [ "https://kubeless.io/docs/runtimes" ] }, + { "value": "Java", "references": [ "https://kubeless.io/docs/runtimes" ] }, + { "value": "Node.js", "references": [ "https://kubeless.io/docs/runtimes" ] }, + { "value": "Python", "references": [ "https://kubeless.io/docs/runtimes" ] }, + { "value": "Ruby", "references": [ "https://kubeless.io/docs/runtimes" ] } + ], + "runtimeCustomization": [ { "value": true, "references": [ "https://github.com/kubeless/runtimes" ] } ], + "ide": [ { "value": "Visual Studio Code", "references": [ "https://github.com/kubeless/vscode-kubeless" ] } ], + "clientLibs": [], + "pkgSizeQuotas": [ { "value": false, "references": [] } ], + "execTimeQuotas": [ { "value": false, "references": [] } ], + "versioning": [ { "value": "implicit", "references": [ "https://kubeless.io/docs/building-functions/" ], "comment": "Using function tagging" } ], + "appVersioning": [], + "endpointSyncCall": [ { "value": "HTTP", "references": [ "https://kubeless.io/docs/http-triggers"] } ], + "endpointAsyncCall": [], + "endpointCustomization": [ { "value": true, "references": [ "https://kubeless.io/docs/http-triggers/" ] } ], + "endpointTLS": [ { "value": true, "references": [ "https://kubeless.io/docs/http-triggers/" ] } ], + "datastoreBlob": [], + "datastoreDB": [], + "scheduler": [ { "value": true, "references": [ "https://github.com/kubeless/kubeless/blob/master/docs/kubeless-functions.md#scheduled-functions" ] } ], + "messaging": [], + "streaming": [ + { "value": "AWS Kinesis", "references": [ "https://kubeless.io/docs/streaming-functions/" ] }, + { "value": "NATS", "references": [ "https://github.com/kubeless/nats-trigger" ] }, + { "value": "Apache Kafka", "references": [ "https://github.com/kubeless/kafka-trigger" ] } + ], + "specService": [], + "eventSourceIntegration": [ { "value": "plugin-based", "references": [ "https://kubeless.io/docs/implementing-new-trigger/" ] } ], + "orchestrator": [], + "workflowDefType": [], + "workflowDefLang": [], + "controlFlowDocs": [], + "orchExecTimeQuotas": [], + "orchIOQuotas": [], + "testingFunc": [], + "testingNonFunc": [], + "debuggingLocal": [ { "value": "log-based debugging", "references": [ "https://kubeless.io/docs/debug-functions" ], "comment": "Using Kubernetes" } ], + "debuggingRemote": [], + "logging": [], + "monitoring": [ { "value": "Prometheus + Grafana", "references": [ "https://kubeless.io/docs/monitoring/" ] } ], + "obsIntegration": [], + "depAutomation": [ + { "value": "Kubernetes", "references": [ "https://kubeless.io/docs/advanced-function-deployment" ] }, + { "value": "Serverless Framework", "references": [ "https://kubeless.io" ] } + ], + "cicd": [], + "funcMarketplaces": [], + "funcSampleRepos": [ { "value": true, "references": [ "https://github.com/kubeless/kubeless/tree/master/examples" ] } ], + "auth": [ { "value": "Via Kubernetes", "references": [ "https://kubeless.io/docs/http-triggers" ] } ], + "accessControl": [ { "value": "Via Kubernetes", "references": [ "https://kubeless.io/docs/kubeless-functions" ] } ] + } +} diff --git a/src/test/resources/data/cu2-td-lambda.json b/src/test/resources/data/cu2-td-lambda.json new file mode 100644 index 0000000..cbfcebc --- /dev/null +++ b/src/test/resources/data/cu2-td-lambda.json @@ -0,0 +1,131 @@ +{ + "id": "aws-lambda-dossier", + "technologyId": "aws-lambda", + "reviewDate": "2021-02-12", + "reviewedCriteria": { + "license": [ { "value": "AWS Service Terms", "references": [ "https://aws.amazon.com/service-terms" ] } ], + "licenseType": [ { "value": "proprietary" } ], + "installType": [ { "value": "as-a-service", "references": [ "https://aws.amazon.com/lambda" ] } ], + "installTargets": [], + "code": [ { "value": "closed source", "references": [ "https://aws.amazon.com/lambda" ] } ], + "codeLoc": [], + "developedIn": [], + "interfaces": [ + { "value": "CLI", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-awscli.html" ] }, + { "value": "API", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/API_Reference.html" ] }, + { "value": "GUI", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html" ] } + ], + "interfaceAppMgmt": [ + { "value": "create", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/API_Reference.html" ] }, + { "value": "retrieve", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/API_Reference.html" ] }, + { "value": "update", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/API_Reference.html" ] }, + { "value": "delete", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/API_Reference.html" ] } + ], + "interfaceAdmin": [], + "githubStars": [], + "githubForks": [], + "githubIssues": [], + "githubCommits": [], + "githubContributors": [], + "soQuestions": [ { "value": 16800, "references": [ "https://api.stackexchange.com/2.2/questions?&filter=total&site=stackoverflow&tagged=aws-lambda" ] } ], + "docs": [ { "value": "usage", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/welcome.html" ] } ], + "docFunctions": [ + { "value": "development", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/welcome.html" ] }, + { "value": "deployment", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/welcome.html" ] } + ], + "funcRuntimes": [ + { "value": "Go", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html" ] }, + { "value": "Java", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html" ] }, + { "value": ".NET", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html" ] }, + { "value": "Node.js", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html" ] }, + { "value": "Python", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html" ] }, + { "value": "Ruby", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html" ] }, + { "value": "Shell", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/powershell-programming-model.html" ] } + ], + "runtimeCustomization": [ { "value": true, "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html" ] } ], + "ide": [ + { "value": "AWS Cloud9", "references": [ "https://docs.aws.amazon.com/cloud9/latest/user-guide/tutorial-lambda.html" ] }, + { "value": "Eclipse", "references": [ "https://docs.aws.amazon.com/toolkit-for-eclipse/v1/user-guide/lambda.html" ] }, + { "value": "Jetbrains IntelliJ IDEA", "references": [ "https://docs.aws.amazon.com/toolkit-for-jetbrains/latest/userguide/building-lambda.html" ] }, + { "value": "Jetbrains PyCharm", "references": [ "https://docs.aws.amazon.com/toolkit-for-jetbrains/latest/userguide/building-lambda.html" ] }, + { "value": "Jetbrains Webstorm", "references": [ "https://docs.aws.amazon.com/toolkit-for-jetbrains/latest/userguide/building-lambda.html" ] }, + { "value": "Jetbrains Rider", "references": [ "https://docs.aws.amazon.com/toolkit-for-jetbrains/latest/userguide/building-lambda.html" ] }, + { "value": "Visual Studio", "references": [ "https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/lambda-index.html" ] }, + { "value": "Visual Studio Code", "references": [ "https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/serverless-apps.html" ] } + ], + "clientLibs": [ + { "value": "C++", "references": [ "https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/using-lambda-with-go-sdk.html" ] }, + { "value": "Go", "references": [ "https://sdk.amazonaws.com/cpp/api/LATEST/class_aws_1_1_lambda_1_1_lambda_client.html" ] }, + { "value": "Java", "references": [ "https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/lambda-examples.html" ] }, + { "value": ".NET", "references": [ "https://docs.aws.amazon.com/sdkfornet/v3/apidocs/index.html" ] }, + { "value": "Node.js", "references": [ "https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/using-lambda-functions.html" ] }, + { "value": "Python", "references": [ "https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/lambda.html" ] }, + { "value": "Ruby", "references": [ "https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/lambda-examples.html" ] } + ], + "pkgSizeQuotas": [ { "value": true, "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html" ] } ], + "execTimeQuotas": [ { "value": true, "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html" ] } ], + "versioning": [ { "value": "dedicated mechanisms", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/versioning-aliases.html" ] } ], + "appVersioning": [ { "value": "dedicated mechanisms", "references": [ "https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-application.html" ] } ], + "endpointSyncCall": [ { "value": "HTTP", "references": [ "https://docs.aws.amazon.com/en_pv/lambda/latest/dg/invocation-sync.html" ] } ], + "endpointAsyncCall": [ { "value": "HTTP", "references": [ "https://docs.aws.amazon.com/en_pv/lambda/latest/dg/invocation-async.html" ] } ], + "endpointCustomization": [ { "value": true, "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/services-apigateway.html" ] } ], + "endpointTLS": [ { "value": true, "references": [ "https://docs.aws.amazon.com/general/latest/gr/apigateway.html" ] } ], + "datastoreBlob": [ { "value": "AWS S3", "references": [ "https://docs.aws.amazon.com/en_pv/lambda/latest/dg/with-s3.html" ] } ], + "datastoreDB": [ { "value": "Amazon DynamoDB", "references": [ "https://docs.aws.amazon.com/en_pv/lambda/latest/dg/with-ddb.html" ] } ], + "scheduler": [ { "value": true, "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/services-cloudwatchevents-expressions.html" ] } ], + "messaging": [ + { "value": "AWS SQS", "references": [ "https://docs.aws.amazon.com/en_pv/lambda/latest/dg/with-sqs.html" ] }, + { "value": "AWS SNS", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/with-sns.html" ] } + ], + "streaming": [ { "value": "Amazon Kinesis", "references": [ "https://docs.aws.amazon.com/en_pv/lambda/latest/dg/with-kinesis-example.html" ] } ], + "specService": [ + { "value": "Amazon Alexa", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/services-alexa.html" ] }, + { "value": "AWS CloudTrail", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/with-cloudtrail.html" ] }, + { "value": "AWS CloudWatch", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/services-cloudwatchevents.html", "https://docs.aws.amazon.com/lambda/latest/dg/services-cloudwatchlogs.html" ] }, + { "value": "AWS CodeCommit", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/services-codecommit.html" ] }, + { "value": "AWS CodePipeline", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/services-codepipeline.html" ] }, + { "value": "Amazon Cognito", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/services-cognito.html" ] }, + { "value": "AWS Config", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/services-config.html" ] }, + { "value": "AWS EC2", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/services-ec2.html" ], "comment": "Using AWS Cloudwatch events" }, + { "value": "Elastic Load Balancing", "references": [ "https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html" ] }, + { "value": "AWS IoT", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/services-iot.html" ] }, + { "value": "Amazon Kinesis Data Firehose", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/services-kinesisfirehose.html" ] }, + { "value": "Amazon Lex", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/services-lex.html" ] }, + { "value": "Amazon MQ", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/with-mq.html" ] }, + { "value": "Amazon RDS", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/services-rds.html" ] }, + { "value": "Amazon SES", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/services-ses.html" ] }, + { "value": "AWS X-Ray", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/services-xray.html" ] } + ], + "eventSourceIntegration": [ { "value": "event source mappings", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventsourcemapping.html" ] } ], + "orchestrator": [ { "value": "AWS Step Functions", "references": [ "https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html" ] } ], + "workflowDefType": [ { "value": "custom DSL", "references": [ "https://docs.aws.amazon.com/step-functions/latest/dg/concepts-amazon-states-language.html" ] } ], + "workflowDefLang": [], + "controlFlowDocs": [ { "value": true, "references": [ "https://docs.aws.amazon.com/step-functions/latest/dg/concepts-states.html" ] } ], + "orchExecTimeQuotas": [ { "value": true, "references": [ "https://docs.aws.amazon.com/step-functions/latest/dg/limits-overview.html" ] } ], + "orchIOQuotas": [ { "value": true, "references": [ "https://docs.aws.amazon.com/step-functions/latest/dg/limits-overview.html" ] } ], + "testingFunc": [ { "value": "function invocation testing", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html" ] } ], + "testingNonFunc": [ { "value": "load testing guidelines", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html" ] } ], + "debuggingLocal": [ { "value": "step-through debugging", "references": [ "https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-using-debugging.html" ], "comment": "Using IDE plugins or AWS SAM CLI" } ], + "debuggingRemote": [], + "logging": [ + { "value": "Amazon CloudWatch", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/monitoring-functions-logs.html" ] }, + { "value": "AWS CloudTrail", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/with-cloudtrail.html" ] } + ], + "monitoring": [ + { "value": "Amazon CloudWatch", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/monitoring-functions-metrics.html" ] } + ], + "obsIntegration": [], + "depAutomation": [ + { "value": "AWS CloudFormation", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/lambda-rolling-deployments.html" ] }, + { "value": "AWS SAM CLI", "references": [ "https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-reference.html#serverless-sam-cli" ] } + ], + "cicd": [ { "value": "AWS CodePipeline", "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/build-pipeline.html" ] } ], + "funcMarketplaces": [ { "value": "Serverless Application Repository", "references": [ "https://aws.amazon.com/serverless/serverlessrepo" ] } ], + "funcSampleRepos": [ { "value": true, "references": [ "https://docs.aws.amazon.com/lambda/latest/dg/lambda-samples.html" ] } ], + "auth": [ { "value": "AWS IAM", "references": [ "https://docs.aws.amazon.com/en_pv/lambda/latest/dg/security-iam.html" ] } ], + "accessControl": [ + { "value": "resources", "references": [ "https://docs.aws.amazon.com/en_pv/lambda/latest/dg/access-control-identity-based.html" ] }, + { "value": "functions", "references": [ "https://docs.aws.amazon.com/en_pv/lambda/latest/dg/access-control-identity-based.html" ] } + ] + } +} diff --git a/src/test/resources/data/cu2-td-nuclio.json b/src/test/resources/data/cu2-td-nuclio.json new file mode 100644 index 0000000..3e1d728 --- /dev/null +++ b/src/test/resources/data/cu2-td-nuclio.json @@ -0,0 +1,118 @@ +{ + "id": "nuclio-dossier", + "technologyId": "nuclio", + "reviewDate": "2021-02-12", + "reviewedCriteria": { + "license": [ { "value": "Apache 2.0", "references": [ "https://github.com/nuclio/nuclio/blob/master/LICENSE" ] } ], + "licenseType": [ { "value": "permissive" } ], + "installType": [ + { "value": "installable", "references": [ "https://github.com/nuclio/nuclio" ] }, + { "value": "as-a-service", "references": [ "https://nuclio.io" ] } + ], + "installTargets": [ + { "value": "Kubernetes", "references": [ "https://nuclio.io/docs/latest/setup/k8s/" ] } + ], + "code": [ { "value": "open source", "references": [ "https://github.com/nuclio/nuclio" ] } ], + "codeLoc": [ { "value": "GitHub", "references": [ "https://github.com/nuclio/nuclio" ] } ], + "developedIn": [ { "value": "Go", "references": [ "https://github.com/nuclio/nuclio/search?l=go" ] } ], + "interfaces": [ + { "value": "CLI", "references": [ "https://nuclio.io/docs/latest/reference/nuctl/" ] }, + { "value": "GUI", "references": [ "https://github.com/nuclio/nuclio/blob/master/README.md#dashboard" ] } + ], + "interfaceAppMgmt": [ + { "value": "create", "references": [ "https://nuclio.io/docs/latest/reference/nuctl/" ] }, + { "value": "retrieve", "references": [ "https://nuclio.io/docs/latest/reference/nuctl/" ] }, + { "value": "update", "references": [ "https://nuclio.io/docs/latest/reference/nuctl/" ] }, + { "value": "delete", "references": [ "https://nuclio.io/docs/latest/reference/nuctl/" ] } + ], + "interfaceAdmin": [ + { "value": "deployment", "references": [ "https://nuclio.io/docs/latest/setup/k8s/" ] }, + { "value": "configuration", "references": [ "https://nuclio.io/docs/latest/tasks/configuring-a-platform/" ] }, + { "value": "enactment", "references": [ "https://nuclio.io/docs/latest/setup/k8s/" ] } + ], + "githubStars": [ { "value": 3818, "references": [ "https://github.com/nuclio/nuclio/stargazers" ] } ], + "githubForks": [ { "value": 384, "references": [ "https://github.com/nuclio/nuclio/network/members" ] } ], + "githubIssues": [ { "value": 80, "references": [ "https://github.com/nuclio/nuclio/issues" ] } ], + "githubCommits": [ { "value": 1394, "references": [ "https://github.com/nuclio/nuclio/commits/development" ] } ], + "githubContributors": [ { "value": 61, "references": [ "https://github.com/nuclio/nuclio/graphs/contributors" ] } ], + "soQuestions": [ { "value": 6, "references": [ "https://api.stackexchange.com/2.2/questions?&filter=total&site=stackoverflow&tagged=nuclio" ] } ], + "docs": [ + { "value": "usage", "references": [ "https://nuclio.io/docs/latest/introduction/" ] }, + { "value": "deployment", "references": [ "https://nuclio.io/docs/latest/setup/" ] }, + { "value": "architecture", "references": [ "https://nuclio.io/docs/latest/concepts/architecture/" ] } + ], + "docFunctions": [ + { "value": "deployment", "references": [ "https://nuclio.io/docs/latest/tasks/deploying-functions/" ] } + ], + "funcRuntimes": [ + { "value": "Binary", "references": [ "https://nuclio.io/docs/latest/reference/runtimes/shell/writing-a-shell-function" ] }, + { "value": "Docker Image", "references": [ "https://nuclio.io/docs/latest/tasks/deploy-functions-from-dockerfile/" ] }, + { "value": "C#", "references": [ "https://nuclio.io/docs/latest/reference/runtimes/dotnetcore/" ] }, + { "value": "Go", "references": [ "https://nuclio.io/docs/latest/reference/runtimes/golang/" ] }, + { "value": "Java", "references": [ "https://nuclio.io/docs/latest/reference/runtimes/java/" ] }, + { "value": "Node.js", "references": [ "https://nuclio.io/docs/latest/reference/runtimes/nodejs/" ] }, + { "value": "Python", "references": [ "https://nuclio.io/docs/latest/reference/runtimes/python/" ] }, + { "value": "Shell", "references": [ "https://nuclio.io/docs/latest/reference/runtimes/shell/" ] } + ], + "runtimeCustomization": [ { "value": true, "references": [ "https://nuclio.io/docs/latest/reference/function-configuration/function-configuration-reference/" ] } ], + "ide": [ { "value": "Jupyter Notebooks", "references": [ "https://github.com/nuclio/nuclio-jupyter" ] } ], + "clientLibs": [ + { "value": "Go", "references": [ "https://github.com/nuclio/nuclio-sdk-go" ] }, + { "value": "Java", "references": [ "https://github.com/nuclio/nuclio-sdk-java" ] }, + { "value": "C#", "references": [ "https://github.com/nuclio/nuclio-sdk-dotnetcore" ] }, + { "value": "Python", "references": [ "https://github.com/nuclio/nuclio-sdk-py" ] } + ], + "pkgSizeQuotas": [ { "value": false, "references": [] } ], + "execTimeQuotas": [ { "value": false, "references": [] } ], + "versioning": [ { "value": "dedicated mechanisms", "references": [ "https://github.com/nuclio/nuclio/blob/master/docs/concepts/architecture.md#function-versioning" ] } ], + "appVersioning": [], + "endpointSyncCall": [ { "value": "HTTP", "references": [ "https://nuclio.io/docs/latest/reference/triggers/"] } ], + "endpointAsyncCall": [], + "endpointCustomization": [ { "value": true, "references": [ "https://nuclio.io/docs/latest/reference/triggers/" ] } ], + "endpointTLS": [ { "value": false, "references": [] } ], + "datastoreBlob": [], + "datastoreDB": [], + "scheduler": [ { "value": true, "references": [ "https://nuclio.io/docs/latest/reference/triggers/cron/" ] } ], + "messaging": [ + { "value": "RabbitMQ", "references": [ "https://nuclio.io/docs/latest/reference/triggers/rabbitmq/"] }, + { "value": "MQTT", "references": [ "https://nuclio.io/docs/latest/reference/triggers/mqtt/"] }, + { "value": "NATS", "references": [ "https://nuclio.io/docs/latest/reference/triggers/nats/"] } + ], + "streaming": [ + { "value": "Apache Kafka", "references": [ "https://nuclio.io/docs/latest/reference/triggers/kafka/"] }, + { "value": "AWS Kinesis", "references": [ "https://nuclio.io/docs/latest/reference/triggers/kinesis/"] }, + { "value": "Iguazio Data Science Platform", "references": [ "https://nuclio.io/docs/latest/reference/triggers/v3iostream/"] }, + { "value": "Azure Event Hubs", "references": [ "https://nuclio.io/docs/latest/reference/triggers/eventhub/"] } + ], + "specService": [], + "eventSourceIntegration": [], + "orchestrator": [], + "workflowDefType": [], + "workflowDefLang": [], + "controlFlowDocs": [], + "orchExecTimeQuotas": [], + "orchIOQuotas": [], + "testingFunc": [], + "testingNonFunc": [], + "debuggingLocal": [], + "debuggingRemote": [], + "logging": [ + { "value": "stdout", "references": [ "https://nuclio.io/docs/latest/tasks/configuring-a-platform/#supported-metric-sinks" ] }, + { "value": "Azure Application Insights", "references": [ "https://nuclio.io/docs/latest/tasks/configuring-a-platform/#supported-metric-sinks" ] } + ], + "monitoring": [ + { "value": "Prometheus", "references": [ "https://nuclio.io/docs/latest/tasks/configuring-a-platform/#supported-log-sinks" ] }, + { "value": "Azure Application Insights", "references": [ "https://nuclio.io/docs/latest/tasks/configuring-a-platform/#supported-log-sinks" ] } + ], + "obsIntegration": [ + { "value": "push-based", "references": [ "https://nuclio.io/docs/latest/tasks/configuring-a-platform/" ] }, + { "value": "pull-based", "references": [ "https://nuclio.io/docs/latest/tasks/configuring-a-platform/" ] } + ], + "depAutomation": [ { "value": "nuctl", "references": [ "https://nuclio.io/docs/latest/reference/nuctl/" ] } ], + "cicd": [], + "funcMarketplaces": [], + "funcSampleRepos": [ { "value": true, "references": [ "https://nuclio.io/docs/latest/examples/" ] } ], + "auth": [], + "accessControl": [] + } +} diff --git a/src/test/resources/data/cu2-td-openfaas.json b/src/test/resources/data/cu2-td-openfaas.json new file mode 100644 index 0000000..0972d55 --- /dev/null +++ b/src/test/resources/data/cu2-td-openfaas.json @@ -0,0 +1,126 @@ +{ + "id": "openfaas-dossier", + "technologyId": "openfaas", + "reviewDate": "2021-02-12", + "reviewedCriteria": { + "license": [ { "value": "MIT", "references": [ "https://github.com/openfaas/faas/blob/master/LICENSE" ] } ], + "licenseType": [ { "value": "permissive" } ], + "installType": [ { "value": "installable", "references": [ "https://docs.openfaas.com/deployment/" ] } ], + "installTargets": [ + { "value": "Docker", "references": [ "https://docs.openfaas.com/deployment/" ] }, + { "value": "faasd", "references": [ "https://docs.openfaas.com/deployment/" ] }, + { "value": "Kubernetes", "references": [ "https://docs.openfaas.com/deployment/" ] }, + { "value": "Openshift", "references": [ "https://docs.openfaas.com/deployment/" ] } + ], + "code": [ { "value": "open source", "references": [ "https://github.com/openfaas/faas" ] } ], + "codeLoc": [ { "value": "GitHub", "references": [ "https://github.com/openfaas/faas" ] } ], + "developedIn": [ { "value": "Go", "references": [ "https://github.com/openfaas/faas/search?l=go" ] } ], + "interfaces": [ + { "value": "CLI", "references": [ "https://docs.openfaas.com/cli/install/" ] }, + { "value": "API", "references": [ "https://github.com/openfaas/faas/tree/master/api-docs" ] }, + { "value": "GUI", "references": [ "https://github.com/openfaas/faas/blob/master/gateway/README.md#ui-portal" ] } + ], + "interfaceAppMgmt": [ + { "value": "create", "references": [ "https://github.com/openfaas/faas-cli" ] }, + { "value": "retrieve", "references": [ "https://github.com/openfaas/faas-cli" ] }, + { "value": "update", "references": [ "https://github.com/openfaas/faas-cli" ] }, + { "value": "delete", "references": [ "https://github.com/openfaas/faas-cli" ] } + ], + "interfaceAdmin": [ + { "value": "deployment", "references": [ "https://docs.openfaas.com/deployment/" ] }, + { "value": "enactment", "references": [ "https://docs.openfaas.com/deployment/" ] } + ], + "githubStars": [ { "value": 19400, "references": [ "https://github.com/openfaas/faas/stargazers" ] } ], + "githubForks": [ { "value": 1600, "references": [ "https://github.com/openfaas/faas/network/members" ] } ], + "githubIssues": [ { "value": 19, "references": [ "https://github.com/openfaas/faas/issues" ] } ], + "githubCommits": [ { "value": 1994, "references": [ "https://github.com/openfaas/faas/commits/master" ] } ], + "githubContributors": [ { "value": 156, "references": [ "https://github.com/openfaas/faas/graphs/contributors" ] } ], + "soQuestions": [ { "value": 45, "references": [ "https://api.stackexchange.com/2.2/questions?&filter=total&site=stackoverflow&tagged=openfaas" ] } ], + "docs": [ + { "value": "usage", "references": [ "https://docs.openfaas.com/" ] }, + { "value": "development", "references": [ "https://docs.openfaas.com/contributing/get-started/" ] }, + { "value": "deployment", "references": [ "https://docs.openfaas.com/deployment/" ] }, + { "value": "architecture", "references": [ "https://docs.openfaas.com/architecture/stack/" ] } + ], + "docFunctions": [ + { "value": "deployment", "references": [ "https://github.com/openfaas/faas-cli" ] } + ], + "funcRuntimes": [ + { "value": "C#", "references": [ "https://github.com/openfaas/templates" ] }, + { "value": "Docker Image", "references": [ "https://github.com/openfaas/templates" ] }, + { "value": "Go", "references": [ "https://github.com/openfaas/templates" ] }, + { "value": "Java", "references": [ "https://github.com/openfaas/templates" ] }, + { "value": "Node.js", "references": [ "https://github.com/openfaas/templates" ] }, + { "value": "Python", "references": [ "https://github.com/openfaas/templates" ] }, + { "value": "PHP", "references": [ "https://github.com/openfaas/templates" ] }, + { "value": "Ruby", "references": [ "https://github.com/openfaas/templates" ] } + ], + "runtimeCustomization": [ { "value": true, "references": [ "https://github.com/openfaas/templates" ] } ], + "ide": [], + "clientLibs": [], + "pkgSizeQuotas": [ { "value": false, "references": [] } ], + "execTimeQuotas": [ { "value": false, "references": [] } ], + "versioning": [ { "value": "implicit", "references": [ "https://github.com/openfaas/faas/issues/1075" ] } ], + "appVersioning": [], + "endpointSyncCall": [ { "value": "HTTP", "references": [ "https://docs.openfaas.com/reference/triggers/"] } ], + "endpointAsyncCall": [ { "value": "HTTP", "references": [ "https://docs.openfaas.com/reference/triggers/"] } ], + "endpointCustomization": [ { "value": true, "references": [ "https://docs.openfaas.com/reference/ssl/kubernetes-with-cert-manager/#20-tls-and-custom-domains-for-functions" ] } ], + "endpointTLS": [ { "value": true, "references": [ "https://docs.openfaas.com/reference/ssl/kubernetes-with-cert-manager/" ] } ], + "datastoreBlob": [ { "value": "Min.io", "references": [ "https://docs.openfaas.com/reference/triggers/"] } ], + "datastoreDB": [ { "value": "Redis", "references": [ "https://docs.openfaas.com/reference/triggers/"] } ], + "scheduler": [ { "value": true, "references": [ "https://docs.openfaas.com/reference/triggers/"] } ], + "messaging": [ + { "value": "AWS SQS", "references": [ "https://docs.openfaas.com/reference/triggers/"] }, + { "value": "AWS SNS", "references": [ "https://docs.openfaas.com/reference/triggers/"] }, + { "value": "MQTT", "references": [ "https://docs.openfaas.com/reference/triggers/"] } + ], + "streaming": [ + { "value": "Apache Kafka", "references": [ "https://docs.openfaas.com/reference/triggers/"] }, + { "value": "NATS", "references": [ "https://docs.openfaas.com/reference/triggers/"] } + ], + "specService": [ + { "value": "Azure Event Grid", "references": [ "https://docs.openfaas.com/reference/triggers/"] }, + { "value": "IFTT", "references": [ "https://docs.openfaas.com/reference/triggers/"] }, + { "value": "VMWare vCenter", "references": [ "https://docs.openfaas.com/reference/triggers/"] } + ], + "eventSourceIntegration": [ { "value": "connector plugins", "references": [ "https://docs.openfaas.com/reference/triggers/"] } ], + "orchestrator": [], + "workflowDefType": [], + "workflowDefLang": [], + "controlFlowDocs": [], + "orchExecTimeQuotas": [], + "orchIOQuotas": [], + "testingFunc": [], + "testingNonFunc": [], + "debuggingLocal": [ { "value": "log-based debugging", "references": [ "https://docs.openfaas.com/deployment/troubleshooting/" ] } ], + "debuggingRemote": [], + "logging": [ + { "value": "Kubernetes Cluster API", "references": [ "https://docs.openfaas.com/architecture/logs-provider/" ] }, + { "value": "Swarm Cluster API", "references": [ "https://docs.openfaas.com/architecture/logs-provider/" ] }, + { "value": "Loki", "references": [ "https://docs.openfaas.com/architecture/logs-provider/" ] } + ], + "monitoring": [ + { "value": "OpenFaaS Gateway + Prometheus", "references": [ "https://docs.openfaas.com/architecture/metrics/" ] } + ], + "obsIntegration": [ { "value": "pull-based", "references": [ "https://docs.openfaas.com/architecture/logs-provider/" ] } ], + "depAutomation": [ { "value": "faas-cli", "references": [ "https://docs.openfaas.com/cli/build/" ] } ], + "cicd": [ + { "value": "OpenFaaS Cloud", "references": [ "https://docs.openfaas.com/reference/cicd/intro/" ] }, + { "value": "faas-cli", "references": [ "https://docs.openfaas.com/reference/cicd/intro/" ] }, + { "value": "GitLab CI/CD", "references": [ "https://docs.openfaas.com/reference/cicd/intro/" ] }, + { "value": "Jenkins", "references": [ "https://docs.openfaas.com/reference/cicd/intro/" ] }, + { "value": "Travis", "references": [ "https://docs.openfaas.com/reference/cicd/intro/" ] }, + { "value": "CodeFresh", "references": [ "https://docs.openfaas.com/reference/cicd/intro/" ] }, + { "value": "Drone CI", "references": [ "https://docs.openfaas.com/reference/cicd/intro/" ] }, + { "value": "Circle CI", "references": [ "https://docs.openfaas.com/reference/cicd/intro/" ] } + ], + "funcMarketplaces": [ { "value": "OpenFaaS Function Store", "references": [ "https://github.com/openfaas/store" ] } ], + "funcSampleRepos": [ { "value": true, "references": [ "https://github.com/openfaas/faas/tree/master/sample-functions" ] } ], + "auth": [ + { "value": "shared secrets", "references": [ "https://docs.openfaas.com/reference/authentication/" ] }, + { "value": "built-in basic authentication", "references": [ "https://docs.openfaas.com/reference/authentication/" ] }, + { "value": "proprietary OAuth2 API access plugin", "references": [ "https://docs.openfaas.com/reference/authentication/" ] } + ], + "accessControl": [ { "value": "resources", "references": [ "https://docs.openfaas.com/reference/yaml" ] } ] + } +} diff --git a/src/test/resources/data/cu2-td-openwhisk.json b/src/test/resources/data/cu2-td-openwhisk.json new file mode 100644 index 0000000..669d710 --- /dev/null +++ b/src/test/resources/data/cu2-td-openwhisk.json @@ -0,0 +1,129 @@ +{ + "id": "apache-openwhisk-dossier", + "technologyId": "apache-openwhisk", + "reviewDate": "2021-02-12", + "reviewedCriteria": { + "license": [ { "value": "Apache 2.0", "references": [ "https://github.com/apache/openwhisk/blob/master/LICENSE.txt" ] } ], + "licenseType": [ { "value": "permissive" } ], + "installType": [ { "value": "installable", "references": [ "https://openwhisk.apache.org/documentation.html#openwhisk_deployment" ], "comment": "IBM Cloud Functions is based on Apache Openwhisk" } ], + "installTargets": [ + { "value": "Docker", "references": [ "https://openwhisk.apache.org/documentation.html#deploy_docker_compose" ] }, + { "value": "Kubernetes", "references": [ "https://openwhisk.apache.org/documentation.html#deploy_kubernetes" ] }, + { "value": "Linux", "references": [ "https://github.com/apache/openwhisk/blob/master/tools/ubuntu-setup/README.md" ] }, + { "value": "MacOS", "references": [ "https://github.com/apache/openwhisk/blob/master/tools/macos/README.md" ] }, + { "value": "Mesos", "references": [ "https://github.com/apache/openwhisk-deploy-mesos/blob/master/README.md" ] } + ], + "code": [ { "value": "open source", "references": [ "https://github.com/apache/openwhisk" ] } ], + "codeLoc": [ { "value": "GitHub", "references": [ "https://github.com/apache/openwhisk" ] } ], + "developedIn": [ { "value": "Scala", "references": [ "https://github.com/apache/openwhisk/search?l=scala" ] } ], + "interfaces": [ + { "value": "CLI", "references": [ "https://openwhisk.apache.org/documentation.html#wsk-cli" ] }, + { "value": "API", "references": [ "https://github.com/apache/openwhisk/blob/master/docs/rest_api.md#using-rest-apis-with-openwhisk" ] } + ], + "interfaceAppMgmt": [ + { "value": "create", "references": [], "comment": "The interface is not documented explicitly, available features can be checked via the CLI tool with the -help flag" }, + { "value": "retrieve", "references": [], "comment": "The interface is not documented explicitly, available features can be checked via the CLI tool with the -help flag" }, + { "value": "update", "references": [], "comment": "The interface is not documented explicitly, available features can be checked via the CLI tool with the -help flag" }, + { "value": "delete", "references": [], "comment": "The interface is not documented explicitly, available features can be checked via the CLI tool with the -help flag" } + ], + "interfaceAdmin": [ + { "value": "deployment", "references": [ "https://openwhisk.apache.org/documentation.html#openwhisk_deployment" ] }, + { "value": "configuration", "references": [ "https://github.com/apache/openwhisk/tree/master/tools/admin" ] }, + { "value": "enactment", "references": [ "https://openwhisk.apache.org/documentation.html#openwhisk_deployment" ] } + ], + "githubStars": [ { "value": 4800, "references": [ "https://github.com/apache/openwhisk/stargazers" ] } ], + "githubForks": [ { "value": 932, "references": [ "https://github.com/apache/openwhisk/network/members" ] } ], + "githubIssues": [ { "value": 274, "references": [ "https://github.com/apache/openwhisk/issues" ] } ], + "githubCommits": [ { "value": 2790, "references": [ "https://github.com/apache/openwhisk" ] } ], + "githubContributors": [ { "value": 180, "references": [ "https://github.com/apache/openwhisk" ] } ], + "soQuestions": [ { "value": 198, "references": [ "https://api.stackexchange.com/2.2/questions?&filter=total&site=stackoverflow&tagged=openwhisk" ] } ], + "docs": [ + { "value": "usage", "references": [ "https://openwhisk.apache.org/documentation.html#using-openwhisk" ] }, + { "value": "development", "references": [ "https://openwhisk.apache.org/documentation.html#contributors" ] }, + { "value": "deployment", "references": [ "https://openwhisk.apache.org/documentation.html#openwhisk_deployment" ] }, + { "value": "architecture", "references": [ "https://github.com/apache/openwhisk/blob/master/docs/about.md#how-openWhisk-works" ] } + ], + "docFunctions": [ + { "value": "development", "references": [ "https://openwhisk.apache.org/documentation.html" ] }, + { "value": "deployment", "references": [ "https://openwhisk.apache.org/documentation.html#actions-creating-and-invoking", "https://openwhisk.apache.org/documentation.html#wskdeploy" ] } + ], + "funcRuntimes": [ + { "value": "Ballerina", "references": [ "https://github.com/apache/openwhisk-runtime-ballerina#readme" ] }, + { "value": "Binary", "references": [ "https://github.com/apache/openwhisk/blob/master/docs/dev/modules.md#runtimes" ] }, + { "value": "Docker Image", "references": [ "https://github.com/apache/openwhisk-runtime-docker#readme" ] }, + { "value": "Go", "references": [ "https://github.com/apache/openwhisk-runtime-go#readme" ] }, + { "value": "Java", "references": [ "https://github.com/apache/openwhisk-runtime-java#readme" ] }, + { "value": ".NET", "references": [ "https://github.com/apache/openwhisk-runtime-dotnet#readme" ] }, + { "value": "Node.js", "references": [ "https://github.com/apache/openwhisk-runtime-nodejs#readme" ] }, + { "value": "PHP", "references": [ "https://github.com/apache/openwhisk-runtime-php#readme" ] }, + { "value": "Python", "references": [ "https://github.com/apache/openwhisk-runtime-python#readme" ] }, + { "value": "Ruby", "references": [ "https://github.com/apache/openwhisk-runtime-ruby#readme" ] }, + { "value": "Rust", "references": [ "https://github.com/apache/openwhisk-runtime-rust#readme" ] }, + { "value": "Shell", "references": [ "https://github.com/apache/openwhisk/blob/master/docs/actions-docker.md#example-shell-script" ] }, + { "value": "Swift", "references": [ "https://github.com/apache/openwhisk-runtime-swift#readme" ] } + ], + "runtimeCustomization": [ { "value": true, "references": [ "https://github.com/apache/openwhisk/blob/master/docs/actions-new.md" ] } ], + "ide": [ + { "value": "Visual Studio Code", "references": [ "https://github.com/apache/openwhisk-vscode" ], "comment": "deprecated" }, + { "value": "Xcode", "references": [ "https://github.com/apache/openwhisk-xcode" ], "comment": "deprecated" } + ], + "clientLibs": [ + { "value": "Go", "references": [ "https://github.com/apache/openwhisk-client-go/blob/master/README.md" ] }, + { "value": "Node.js", "references": [ "https://github.com/apache/openwhisk-client-js/blob/master/README.md#openwhisk-client-for-javascript" ] } + ], + "pkgSizeQuotas": [ { "value": false, "references": [ "https://github.com/apache/openwhisk/blob/master/docs/reference.md#system-limits" ] } ], + "execTimeQuotas": [ { "value": true, "references": [ "https://github.com/apache/openwhisk/blob/master/docs/reference.md#system-limits" ] } ], + "versioning": [ { "value": "implicit", "references": [] } ], + "appVersioning": [ { "value": "implicit", "references": [] } ], + "endpointSyncCall": [ { "value": "HTTP", "references": [ "https://github.com/apache/openwhisk/blob/master/docs/webactions.md", "https://github.com/apache/openwhisk/blob/master/docs/rest_api.md#actions"] } ], + "endpointAsyncCall": [ { "value": "HTTP", "references": [ "https://github.com/apache/openwhisk/blob/master/docs/rest_api.md#actions"], "comment": "non-blocking invocation is set by default" } ], + "endpointCustomization": [ { "value": true, "references": [ "https://github.com/apache/openwhisk/blob/master/docs/apigateway.md" ] } ], + "endpointTLS": [ { "value": true, "references": [ "https://github.com/apache/openwhisk/blob/master/docs/webactions.md" ] } ], + "datastoreBlob": [], + "datastoreDB": [ { "value": "IBM Cloudant", "references": [ "https://github.com/apache/openwhisk-package-cloudant/blob/master/README.md" ] } ], + "scheduler": [ { "value": true, "references": [ "https://github.com/apache/incubator-openwhisk-package-alarms/blob/master/README.md" ] } ], + "messaging": [], + "streaming": [ + { "value": "Apache Kafka", "references": [ "https://github.com/apache/openwhisk-package-kafka/blob/master/README.md" ] }, + { "value": "IBM Message Hub", "references": [ "https://github.com/apache/openwhisk-package-kafka/blob/master/README.md" ] } + ], + "specService": [ + { "value": "GitHub", "references": [ "https://github.com/apache/openwhisk-catalog/blob/master/packages/github/README.md" ] }, + { "value": "Slack", "references": [ "https://github.com/apache/openwhisk-catalog/blob/master/packages/slack/README.md" ] }, + { "value": "Weather Company Data", "references": [ "https://github.com/apache/openwhisk-catalog/blob/master/packages/weather/README.md" ] }, + { "value": "IBM Push Notifications", "references": [ "https://github.com/apache/openwhisk-package-pushnotifications/blob/master/README.md" ] }, + { "value": "Websocket API", "references": [ "https://github.com/apache/openwhisk-catalog/blob/master/packages/websocket/README.md" ] } + ], + "eventSourceIntegration": [ + { "value": "hooks", "references": [ "https://github.com/apache/openwhisk/blob/master/docs/feeds.md" ] }, + { "value": "polling", "references": [ "https://github.com/apache/openwhisk/blob/master/docs/feeds.md" ] }, + { "value": "connection", "references": [ "https://github.com/apache/openwhisk/blob/master/docs/feeds.md" ] } + ], + "orchestrator": [ { "value": "Apache OpenWhisk Composer", "references": [ "https://github.com/apache/openwhisk-composer" ] } ], + "workflowDefType": [ { "value": "orchestrating function", "references": [ "https://github.com/apache/openwhisk-composer#defining-a-composition" ] } ], + "workflowDefLang": [ + { "value": "JavaScript", "references": [ "https://github.com/apache/openwhisk-composer#defining-a-composition" ] }, + { "value": "Python", "references": [ "https://github.com/apache/openwhisk-composer-python" ] } + ], + "controlFlowDocs": [ { "value": true, "references": [ "https://github.com/apache/openwhisk-composer/blob/master/docs/COMBINATORS.md" ] } ], + "orchExecTimeQuotas": [ { "value": true, "references": [ "https://github.com/apache/openwhisk-composer/blob/master/docs/COMMANDS.md#deploy" ] } ], + "orchIOQuotas": [ { "value": false, "references": [] } ], + "testingFunc": [ { "value": "function invocation testing", "references": [ "https://github.com/apache/openwhisk-devtools/blob/master/node-local/README.md" ], "comment": "Using Openwhisk's CLI tool" } ], + "testingNonFunc": [], + "debuggingLocal": [], + "debuggingRemote": [], + "logging": [ { "value": "Logback (slf4j)", "references": [ "https://github.com/apache/openwhisk/blob/master/docs/logging.md" ] } ], + "monitoring": [ + { "value": "Kamon", "references": [ "https://github.com/apache/openwhisk/tree/master/core/monitoring/user-events", "https://github.com/apache/openwhisk/blob/master/docs/metrics.md" ] }, + { "value": "Prometheus", "references": [ "https://github.com/apache/openwhisk/tree/master/core/monitoring/user-events" ], "comment": "User events can be pushed via Kamon using user-events service" }, + { "value": "Datadog", "references": [ "https://github.com/apache/openwhisk/tree/master/core/monitoring/user-events" ], "comment": "User events can be pushed via Kamon using user-events service" } + ], + "obsIntegration": [], + "depAutomation": [ { "value": "wskdeploy", "references": [ "https://github.com/apache/openwhisk-wskdeploy" ] } ], + "cicd": [], + "funcMarketplaces": [], + "funcSampleRepos": [ { "value": true, "references": [ "https://openwhisk.apache.org/documentation.html#contributors" ], "comment": "See Samples block" } ], + "auth": [ { "value": "shared secrets", "references": [ "https://github.com/apache/openwhisk/blob/master/docs/webactions.md#securing-web-actions" ] } ], + "accessControl": [] + } +} diff --git a/src/test/resources/data/cu2-technologies.json b/src/test/resources/data/cu2-technologies.json new file mode 100644 index 0000000..32ad381 --- /dev/null +++ b/src/test/resources/data/cu2-technologies.json @@ -0,0 +1,82 @@ +[ + { + "id": "azure-functions", + "technologyName": "Microsoft Azure Functions", + "technologyType": "FAAS", + "logoLocation": "assets/images/vendor/azure.functions.png", + "shortDescription": "Azure Functions is a commercial FaaS platform offered by Microsoft.", + "description": "Azure Functions allows you to run small pieces of code (called \"functions\") without worrying about application infrastructure. With Azure Functions, the cloud infrastructure provides all the up-to-date servers you need to keep your application running at scale. A function is \"triggered\" by a specific type of event. Supported triggers include responding to changes in data, responding to messages, running on a schedule, or as the result of an HTTP request. While you can always code directly against a myriad of services, integrating with other services is streamlined by using bindings. Bindings give you declarative access to a wide variety of Azure and third-party services." + }, + { + "id": "fission", + "technologyName": "Fission", + "technologyType": "FAAS", + "logoLocation": "assets/images/vendor/fission.png", + "shortDescription": "Fission is an open source FaaS platform based on Kubernetes.", + "description": "Fission is a fast, open source serverless framework for Kubernetes with a focus on developer productivity and high performance. Fission operates on just the code: Docker and Kubernetes are abstracted away under normal operation, though you can use both to extend Fission if you want to. Fission is extensible to any language; the core is written in Go, and language-specific parts are isolated in something called environments (more below). Fission currently supports NodeJS, Python, Ruby, Go, PHP, Bash, and any Linux executable, with more languages coming soon." + }, + { + "id": "fn-project", + "technologyName": "Fn Project", + "technologyType": "FAAS", + "logoLocation": "assets/images/vendor/fn-project.png", + "shortDescription": "The Fn project is an open-source container-native FaaS platform that can run on cloud or on-premises.", + "description": "The Fn project is an open-source container-native serverless platform that you can run anywhere -- any cloud or on-premise. It’s easy to use, supports every programming language, and is extensible and performant." + }, + { + "id": "google-cloud-functions", + "technologyName": "Google Cloud Functions", + "technologyType": "FAAS", + "logoLocation": "assets/images/vendor/google.cloud-functions.png", + "shortDescription": "Google Cloud Functions is a commercial FaaS platform by Google.", + "description": "Cloud Functions is Google Cloud’s event-driven serverless compute platform. Run your code locally or in the cloud without having to provision servers. Go from code to deploy with continuous delivery and monitoring tools. Cloud Functions scales up or down, so you pay only for compute resources you use. Easily create end-to-end complex development scenarios by connecting with existing Google Cloud or third-party services." + }, + { + "id": "knative", + "technologyName": "Knative", + "technologyType": "FAAS", + "logoLocation": "assets/images/vendor/knative.png", + "shortDescription": "Knative Serving is an open source FaaS platform running on Kubernetes.", + "description": "Knative (pronounced kay-nay-tiv) extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center." + }, + { + "id": "kubeless", + "technologyName": "Kubeless", + "technologyType": "FAAS", + "logoLocation": "assets/images/vendor/kubeless.png", + "shortDescription": "Kubeless is an open source, Kubernetes-native FaaS platform.", + "description": "Kubeless is a Kubernetes-native serverless framework that lets you deploy small bits of code (functions) without having to worry about the underlying infrastructure. It is designed to be deployed on top of a Kubernetes cluster and take advantage of all the great Kubernetes primitives. If you are looking for an open source serverless solution that clones what you can find on AWS Lambda, Azure Functions, and Google Cloud Functions, Kubeless is for you!" + }, + { + "id": "aws-lambda", + "technologyName": "AWS Lambda", + "technologyType": "FAAS", + "logoLocation": "assets/images/vendor/aws.lambda.png", + "shortDescription": "AWS Lambda is a commerical FaaS platform offering from Amazon.", + "description": "AWS Lambda lets you run code without provisioning or managing servers. You pay only for the compute time you consume. With Lambda, you can run code for virtually any type of application or backend service - all with zero administration. Just upload your code and Lambda takes care of everything required to run and scale your code with high availability. You can set up your code to automatically trigger from other AWS services or call it directly from any web or mobile app." + }, + { + "id": "nuclio", + "technologyName": "Nuclio", + "technologyType": "FAAS", + "logoLocation": "assets/images/vendor/nuclio.png", + "shortDescription": "Nuclio is an open source serverless platform focusing on data-science based applications.", + "description": "Nuclio is a high-performance \"serverless\" framework focused on data, I/O, and compute intensive workloads. It is well integrated with popular data science tools, such as Jupyter and Kubeflow; supports a variety of data and streaming sources; and supports execution over CPUs and GPUs. The Nuclio project began in 2017 and is constantly and rapidly evolving; many start-ups and enterprises are now using Nuclio in production." + }, + { + "id": "openfaas", + "technologyName": "OpenFaaS", + "technologyType": "FAAS", + "logoLocation": "assets/images/vendor/openfaas.png", + "shortDescription": "OpenFaaS is an open source FaaS platform working with a variety of container platforms.", + "description": "OpenFaaS makes it easy for developers to deploy event-driven functions and microservices to Kubernetes without repetitive, boiler-plate coding. Package your code or an existing binary in a Docker image to get a highly scalable endpoint with auto-scaling and metrics." + }, + { + "id": "apache-openwhisk", + "technologyName": "Apache Openwhisk", + "technologyType": "FAAS", + "logoLocation": "assets/images/vendor/apache.openwhisk.png", + "shortDescription": "Apache OpenWhisk is an open source FaaS platform from Apache Software Foundation.", + "description": "Apache OpenWhisk is an open source, distributed Serverless platform that executes functions (fx) in response to events at any scale. OpenWhisk manages the infrastructure, servers and scaling using Docker containers so you can focus on building amazing and efficient applications. The OpenWhisk platform supports a programming model in which developers write functional logic (called Actions), in any supported programming language, that can be dynamically scheduled and run in response to associated events (via Triggers) from external sources (Feeds) or from HTTP requests. The project includes a REST API-based Command Line Interface (CLI) along with other tooling to support packaging, catalog services and many popular container deployment options." + } +] diff --git a/src/test/resources/data/cu3-filters.json b/src/test/resources/data/cu3-filters.json new file mode 100644 index 0000000..2c814cf --- /dev/null +++ b/src/test/resources/data/cu3-filters.json @@ -0,0 +1,253 @@ +{ + "id": "faas-filter", + "technologyType": "FAAS", + "name": "Main filter", + "filters": [ + { + "criterionTypeId": "license", + "displayName": "License", + "filterType": "containsOne" + }, + { + "criterionTypeId": "licenseType", + "displayName": "License Type", + "filterType": "containsOne" + }, + { + "criterionTypeId": "installType", + "displayName": "Installation", + "filterType": "containsOne" + }, + { + "criterionTypeId": "installTargets", + "displayName": "Installation Targets", + "filterType": "containsOne" + }, + { + "criterionTypeId": "code", + "displayName": "Source Code Availability", + "filterType": "containsOne" + }, + { + "criterionTypeId": "codeLoc", + "displayName": "Source Code Repository", + "filterType": "containsAny" + }, + { + "criterionTypeId": "developedIn", + "displayName": "Main Programming Language", + "filterType": "containsOne" + }, + { + "criterionTypeId": "githubStars", + "displayName": "GitHub Stars", + "filterType": "lte" + }, + { + "criterionTypeId": "githubForks", + "displayName": "GitHub Forks", + "filterType": "lte" + }, + { + "criterionTypeId": "githubIssues", + "displayName": "GitHub Issues", + "filterType": "lte" + }, + { + "criterionTypeId": "githubCommits", + "displayName": "GitHub Commits", + "filterType": "lte" + }, + { + "criterionTypeId": "githubContributors", + "displayName": "GitHub Contributors", + "filterType": "lte" + }, + { + "criterionTypeId": "funcRuntimes", + "displayName": "Function Runtimes", + "filterType": "containsOne" + }, + { + "criterionTypeId": "runtimeCustomization", + "displayName": "Function Runtime Customization", + "filterType": "bool" + }, + { + "criterionTypeId": "ide", + "displayName": "Supported IDEs", + "filterType": "containsOne" + }, + { + "criterionTypeId": "clientLibs", + "displayName": "Client Libraries", + "filterType": "containsOne" + }, + { + "criterionTypeId": "pkgSizeQuotas", + "displayName": "Deployment Package Size Quota", + "filterType": "bool" + }, + { + "criterionTypeId": "execTimeQuotas", + "displayName": "Execution Time Quota", + "filterType": "bool" + }, + { + "criterionTypeId": "funcVersioning", + "displayName": "Function Versioning", + "filterType": "containsOne" + }, + { + "criterionTypeId": "appVersioning", + "displayName": "Application Versioning", + "filterType": "containsOne" + }, + { + "criterionTypeId": "endpointSyncCall", + "displayName": "Synchronous Calls", + "filterType": "containsOne" + }, + { + "criterionTypeId": "endpointAsyncCall", + "displayName": "Asynchronous Calls", + "filterType": "containsOne" + }, + { + "criterionTypeId": "endpointCustomization", + "displayName": "Endpoint Customization", + "filterType": "bool" + }, + { + "criterionTypeId": "endpointTLS", + "displayName": "TLS Support", + "filterType": "bool" + }, + { + "criterionTypeId": "datastoreBlob", + "displayName": "File-level Datastores", + "filterType": "containsOne" + }, + { + "criterionTypeId": "datastoreDB", + "displayName": "Database Mode Datastores", + "filterType": "containsOne" + }, + { + "criterionTypeId": "scheduler", + "displayName": "Scheduled Function Calls", + "filterType": "bool" + }, + { + "criterionTypeId": "messaging", + "displayName": "Message Queues", + "filterType": "containsOne" + }, + { + "criterionTypeId": "streaming", + "displayName": "Stream Processing Platforms", + "filterType": "containsOne" + }, + { + "criterionTypeId": "specService", + "displayName": "Special-purpose Services", + "filterType": "containsOne" + }, + { + "criterionTypeId": "eventSourceIntegration", + "displayName": "Event Sources Integration", + "filterType": "containsOne" + }, + { + "criterionTypeId": "orchestrator", + "displayName": "Native Function Orchestrators", + "filterType": "containsAny" + }, + { + "criterionTypeId": "workflowDefType", + "displayName": "Workflow Definition Type", + "filterType": "containsOne" + }, + { + "criterionTypeId": "workflowDefLang", + "displayName": "Workflow Definition Language", + "filterType": "containsOne" + }, + { + "criterionTypeId": "orchExecTimeQuotas", + "displayName": "Workflow Execution Time Quota", + "filterType": "bool" + }, + { + "criterionTypeId": "orchIOQuotas", + "displayName": "Workflow I/O Size Quota", + "filterType": "bool" + }, + { + "criterionTypeId": "testingFunc", + "displayName": "Functional Testing", + "filterType": "containsAny" + }, + { + "criterionTypeId": "testingNonFunc", + "displayName": "Non-functional Testing", + "filterType": "containsAny" + }, + { + "criterionTypeId": "debuggingLocal", + "displayName": "Local Debugging", + "filterType": "containsAny" + }, + { + "criterionTypeId": "debuggingRemote", + "displayName": "Remote Debugging", + "filterType": "containsAny" + }, + { + "criterionTypeId": "logging", + "displayName": "Logging", + "filterType": "containsAny" + }, + { + "criterionTypeId": "monitoring", + "displayName": "Monitoring", + "filterType": "containsAny" + }, + { + "criterionTypeId": "obsIntegration", + "displayName": "Logging/Monitoring Integration", + "filterType": "containsAny" + }, + { + "criterionTypeId": "depAutomation", + "displayName": "Deployment Automation", + "filterType": "containsAny" + }, + { + "criterionTypeId": "cicd", + "displayName": "CI/CD", + "filterType": "containsAny" + }, + { + "criterionTypeId": "funcMarketplaces", + "displayName": "Function Marketplaces", + "filterType": "containsAny" + }, + { + "criterionTypeId": "funcSampleRepos", + "displayName": "Code Sample Repositories", + "filterType": "bool" + }, + { + "criterionTypeId": "auth", + "displayName": "Authentication", + "filterType": "containsAny" + }, + { + "criterionTypeId": "accessControl", + "displayName": "Access Control", + "filterType": "containsAny" + } + ] +} + diff --git a/src/test/resources/data/cu4-resources.json b/src/test/resources/data/cu4-resources.json new file mode 100644 index 0000000..45ba0dd --- /dev/null +++ b/src/test/resources/data/cu4-resources.json @@ -0,0 +1,97 @@ +[ + { + "id": "basis-publication", + "title": "About this Framework", + "description": "This research publication served as a basis for this selection support system and provides more information about the underlying approach and the data collection process.", + "technologyType": "FAAS", + "resources": [ + { + "resource": "Yussupov et al.: FaaSten your decisions: A classification framework and technology review of function-as-a-Service platforms. In: Journal of Systems and Software. Vol. 175, Elsevier, 2021", + "reference": "https://www.sciencedirect.com/science/article/pii/S0164121221000030" + } + ] + }, + { + "id": "reviewed-white-literature", + "title": "Research Publications", + "description": "Reviewed research publications", + "technologyType": "FAAS", + "resources": [ + { + "resource": "Kritikos and Skrzypek: A review of serverless frameworks. In: IEEE/ACM International Conference on Utility and Cloud Computing Companion (UCC Companion), 2018", + "reference": "https://ieeexplore.ieee.org/document/8605774" + }, + { + "resource": "Lee et al.: Evaluation of production serverless computing environments. In: IEEE 11th International Conference on Cloud Computing (CLOUD), 2018", + "reference": "https://ieeexplore.ieee.org/document/8457830" + }, + { + "resource": "Lynn et al.: A preliminary review of enterprise serverless cloud computing (function-as-a-service) platforms. In: IEEE International Conference on Cloud Computing Technology and Science (CloudCom), 2017", + "reference": "https://ieeexplore.ieee.org/document/8241104" + }, + { + "resource": "Mohanty et al.: An evaluation of open source serverless computing frameworks. In: IEEE International Conference on Cloud Computing Technology and Science (CloudCom), 2018", + "reference": "https://ieeexplore.ieee.org/document/8591002" + }, + { + "resource": "García López et al.: Comparison of faas orchestration systems. In: IEEE/ACM International Conference on Utility and Cloud Computing Companion (UCC Companion), 2018", + "reference": "https://ieeexplore.ieee.org/document/8605772" + }, + { + "resource": "Spillner: Quantitative analysis of cloud function evolution in the AWS serverless application repository. In: arXiv preprint, 2019", + "reference": "https://arxiv.org/abs/1905.04800" + }, + { + "resource": "Rajan: Serverless architecture-a revolution in cloud computing. In: IEEE Tenth International Conference on Advanced Computing (ICoAC), 2018", + "reference": "https://ieeexplore.ieee.org/document/8939081" + }, + { + "resource": "Palade et al.: An evaluation of open source serverless computing frameworks support at the edge. In: IEEE World Congress on Services (SERVICES), 2019", + "reference": "https://ieeexplore.ieee.org/document/8817155" + }, + { + "resource": "Kumar: Serverless architectures review, future trend and the solutions to open problems. In: American Journal of Software Engineering, 2019", + "reference": "http://pubs.sciepub.com/ajse/6/1/1/index.html" + }, + { + "resource": "Kalnauz and Speranskiy: Productivity estimation of serverless computing. In: Appl. Aspects Inf. Technol. (1), 2019", + "reference": "https://aait.opu.ua/?fetch=articles&with=info&id=11" + }, + { + "resource": "Gand et al.: Serverless container cluster management for lightweight edge clouds. In: International Conference on Cloud Computing and Services Science CLOSER, 2020", + "reference": "https://www.scitepress.org/PublicationsDetail.aspx?ID=/f8qOC1rl3o=&t=1" + }, + { + "resource": "Bortolini and Obelheiro: Investigating performance and cost in function-as-a-service platforms. In: International Conference on P2P, Parallel, Grid, Cloud and Internet Computing, Springer, 2019", + "reference": "https://link.springer.com/chapter/10.1007/978-3-030-33509-0_16" + }, + { + "resource": "Wang et al.: Peeking behind the curtains of serverless platforms. In: Proceedings of the 2018 USENIX Conference on Usenix Annual Technical Conference, 2018", + "reference": "https://www.usenix.org/system/files/conference/atc18/atc18-wang-liang.pdf" + }, + { + "resource": "Back and Andrikopoulos: Using a microbenchmark to compare function as a service solutions. In: Service-Oriented and Cloud Computing, Springer International Publishing, 2018", + "reference": "https://link.springer.com/chapter/10.1007%2F978-3-319-99819-0_11" + }, + { + "resource": "Jonas et al.: Cloud programming simplified: A berkeley view on serverless computing. In: arXiv preprint, 2019", + "reference": "https://arxiv.org/abs/1902.03383" + } + ] + }, + { + "id": "gray-literature", + "title": "Gray Literature Sources", + "technologyType": "FAAS", + "resources": [ + { + "resource": "Cloud Native Computing Foundation Serverless Whitepaper", + "reference": "https://github.com/cncf/wg-serverless/tree/master/whitepapers/serverless-overview" + }, + { + "resource": "Cloud Native Computing Foundation Serverless Technology Landscape", + "reference": "https://landscape.cncf.io/serverless" + } + ] + } +] diff --git a/src/test/resources/data/framework.json b/src/test/resources/data/framework.json new file mode 100644 index 0000000..786768c --- /dev/null +++ b/src/test/resources/data/framework.json @@ -0,0 +1,733 @@ +[ + { + "id": "fwFaaS", + "name": "A Classification Framework for Function-as-a-Service Platforms", + "technologyType": "FAAS", + "version": "1.0", + "description": "A framework for classifying Function-as-a-Service platforms which encompasses 56 review criteria. By default, the criteria are grouped into two views: a higher-level, managerial view and a lower-level, DevOps view.", + "frameworkViews": [ + { + "id": "vManagement", + "name": "Managerial View", + "description": "This view combines higher-level classification criteria focusing on general platform properties such as licence or installation type.", + "criteriaGroupings": [ + { + "id": "gLicense", + "locator": "licensing", + "name": "Licensing", + "criteria": [ + { + "id": "license", + "name": "License Name", + "description": "The name of license under which a platform is released.", + "exampleValues": [ + "Apache 2.0", + "GNU GPL 1.0", + "GNU GPL 2.0", + "MIT" + ] + }, + { + "id": "licenseType", + "name": "License Type", + "description": "The type of license under which a platform is released.", + "exampleValues": [ + "public domain", + "permissive", + "copyleft", + "freeware", + "proprietary" + ] + } + ] + }, + { + "id": "gInstallation", + "locator": "installation", + "name": "Installation", + "criteria": [ + { + "id": "installType", + "name": "Installation Type", + "description": "This criterion indicates how a platform can be installed.", + "exampleValues": [ + "as-a-service", + "installable" + ] + }, + { + "id": "installTargets", + "name": "Installation Target Hosts", + "description": "This criterion indicates to which target hosts a platform can be installed.", + "exampleValues": [ + "Docker", + "Kubernetes", + "Linux", + "MacOS", + "Windows" + ] + } + ] + }, + { + "id": "gSourceCode", + "locator": "source-code", + "name": "Source Code", + "criteria": [ + { + "id": "code", + "name": "Source Code Availability", + "description": "This criterion indicates whether a platform's source code is publicly available.", + "exampleValues": [ + "open source", + "closed source" + ] + }, + { + "id": "codeLoc", + "name": "Source Code Repository", + "description": "This criterion indicates which open source repository contains the source code of a given open source platform.", + "exampleValues": [ + "BitBucket", + "GitHub", + "SourceForge" + ] + }, + { + "id": "developedIn", + "name": "Main Programming Language", + "description": "This criterion indicates the main implementation language of a given open source platform.", + "exampleValues": [ + "C", + "C#", + "F#", + "Go", + "Java", + "JavaScript", + "Python", + "Ruby", + "Scala" + ] + } + ] + }, + { + "id": "gInterface", + "locator": "interface", + "name": "Interface", + "criteria": [ + { + "id": "interfaces", + "name": "Interface Types", + "description": "This criterion indicates which interfaces are provided by a given platform.", + "exampleValues": [ + "API", + "CLI", + "GUI" + ] + }, + { + "id": "interfaceAppMgmt", + "name": "Interface Operations for Application Management", + "description": "This criterion indicates which application management operations are supported by a given platform.", + "exampleValues": [ + "creation", + "retrieval", + "update", + "deletion" + ] + }, + { + "id": "interfaceAdmin", + "name": "Interface Operations for Platform Administration", + "description": "This criterion indicates which platform administration operations are supported by a given platform.", + "exampleValues": [ + "deployment", + "configuration", + "enactment", + "termination", + "undeployment" + ] + } + ] + }, + { + "id": "gCommunity", + "locator": "community", + "name": "Community", + "criteriaGroupings": [ + { + "id": "gGithub", + "locator": "github", + "name": "GitHub", + "criteria": [ + { + "id": "githubStars", + "name": "GitHub Stars", + "description": "This criterion indicates how many GitHub stars a given platform has.", + "exampleValues": [ + "numeric value" + ] + }, + { + "id": "githubForks", + "name": "GitHub Forks", + "description": "This criterion indicates how many GitHub forks a given platform has.", + "exampleValues": [ + "numeric value" + ] + }, + { + "id": "githubIssues", + "name": "GitHub Issues", + "description": "This criterion indicates how many GitHub issues a given platform has.", + "exampleValues": [ + "numeric value" + ] + }, + { + "id": "githubCommits", + "name": "GitHub Commits", + "description": "This criterion indicates how many GitHub commits a given platform has.", + "exampleValues": [ + "numeric value" + ] + }, + { + "id": "githubContributors", + "name": "GitHub Contributors", + "description": "This criterion indicates how many GitHub contributors a given platform has.", + "exampleValues": [ + "numeric value" + ] + } + ] + }, + { + "id": "gStackoverflow", + "locator": "stackoverflow", + "name": "Stackoverflow", + "criteria": [ + { + "id": "soQuestions", + "name": "Stackoverflow Questions", + "description": "This criterion indicates how many Stackoverflow questions a given platform has.", + "exampleValues": [ + "numeric value" + ] + } + ] + } + ] + }, + { + "id": "gDocumentation", + "locator": "documentation", + "name": "Documentation", + "criteria": [ + { + "id": "docs", + "name": "Platform Documentation", + "description": "This criterion indicates whether a given platform provides the documentation on how to use and extend it, also including the platform's architecture.", + "exampleValues": [ + "usage", + "development", + "deployment", + "architecture" + ] + }, + { + "id": "docFunctions", + "name": "Functions Documentation", + "description": "This criterion indicates whether a given FaaS platform provides the documentation on how to develop and deploy functions.", + "exampleValues": [ + "development", + "deployment" + ] + } + ] + } + ] + }, + { + "id": "vDevops", + "name": "DevOps View", + "description": "This view combines lower-level classification criteria focusing on technical properties such as supported runtimes or event sources.", + "criteriaGroupings": [ + { + "id": "gDevelopment", + "locator": "development", + "name": "Development", + "criteria": [ + { + "id": "funcRuntimes", + "name": "Function Runtimes", + "description": "This criterion indicates which function runtimes are supported by a given FaaS platform.", + "exampleValues": [ + "C", + "C#", + "F#", + "Go", + "Java", + "JavaScript", + "Python", + "Ruby", + "Scala" + ] + }, + { + "id": "runtimeCustomization", + "name": "Function Runtime Customization", + "description": "This criterion indicates whether a given FaaS platform supports runtime customization.", + "exampleValues": [ + "true", + "false" + ] + }, + { + "id": "ide", + "name": "IDEs and Text Editors", + "description": "This criterion indicates which IDEs and text editor a given platform supports.", + "exampleValues": [ + "IntelliJ IDEA", + "Eclipse", + "Visual Studio Code" + ] + }, + { + "id": "clientLibs", + "name": "Client Libraries", + "description": "This criterion indicates whether a given platform offers client libraries and in which programming languages.", + "exampleValues": [ + "C", + "C#", + "F#", + "Go", + "Java", + "JavaScript", + "Python", + "Ruby", + "Scala" + ] + } + ], + "criteriaGroupings": [ + { + "id": "gDevQuotas", + "locator": "dev-quotas", + "name": "Quotas", + "criteria": [ + { + "id": "pkgSizeQuotas", + "name": "Deployment Package Size Quota", + "description": "This criterion indicates whether a given FaaS platform has quotas on the deployment package size.", + "exampleValues": [ + "true", + "false" + ] + }, + { + "id": "execTimeQuotas", + "name": "Execution Time Quota", + "description": "This criterion indicates whether a given FaaS platform has quotas on the function execution time.", + "exampleValues": [ + "true", + "false" + ] + } + ] + } + ] + }, + { + "id": "gVersioning", + "locator": "versioning", + "name": "Version Management", + "criteria": [ + { + "id": "funcVersioning", + "name": "Function Versions", + "description": "This criterion indicates whether a given FaaS platform supports versioning on the level of functions.", + "exampleValues": [ + "dedicated mechanisms", + "implicit versioning" + ] + }, + { + "id": "appVersioning", + "name": "Application Versions", + "description": "This criterion indicates whether a given FaaS platform supports versioning on the level of application.", + "exampleValues": [ + "dedicated mechanisms", + "implicit versioning", + "no support" + ] + } + ] + }, + { + "id": "gEventSources", + "locator": "event-sources", + "name": "Event Sources", + "criteriaGroupings": [ + { + "id": "gEndpoint", + "locator": "endpoint", + "name": "Endpoint", + "criteria": [ + { + "id": "endpointSyncCall", + "name": "Synchronous Endpoint Call", + "description": "This criterion indicates whether a given FaaS platform supports exposing functions as endpoints for synchronous calls and using which protocols.", + "exampleValues": [ + "HTTP", + "gRPC" + ] + }, + { + "id": "endpointAsyncCall", + "name": "Asynchronous Endpoint Call", + "description": "This criterion indicates whether a given FaaS platform supports exposing functions as endpoints for asynchronous calls and using which protocols.", + "exampleValues": [ + "HTTP", + "gRPC" + ] + }, + { + "id": "endpointCustomization", + "name": "Endpoint Customization", + "description": "This criterion indicates whether a given FaaS platform supports exposing functions as endpoints for asynchronous calls and using which protocols.", + "exampleValues": [ + "true", + "false" + ] + }, + { + "id": "endpointTLS", + "name": "Endpoint TLS Support", + "description": "This criterion indicates whether a given FaaS platform supports exposing functions as secure endpoints using TLS.", + "exampleValues": [ + "true", + "false" + ] + } + ] + }, + { + "id": "gDataStore", + "locator": "data-store", + "name": "Data Store", + "criteria": [ + { + "id": "datastoreBlob", + "name": "File Level Data Stores", + "description": "This criterion indicates which file-level data stores can trigger functions on a given FaaS platform.", + "exampleValues": [ + "AWS S3", + "Min.io" + ] + }, + { + "id": "datastoreDB", + "name": "Database Mode Data Stores", + "description": "This criterion indicates which database-mode data stores can trigger functions on a given FaaS platform.", + "exampleValues": [ + "Azure CosmosDB", + "AWS Aurora" + ] + } + ] + } + ], + "criteria": [ + { + "id": "scheduler", + "name": "Scheduler", + "description": "This criterion indicates whether a given FaaS platform supports scheduled function invocation.", + "exampleValues": [ + "true", + "false" + ] + }, + { + "id": "messaging", + "name": "Message Queue", + "description": "This criterion indicates which messaging solutions can trigger functions on a given FaaS platform.", + "exampleValues": [ + "AWS SQS", + "RabbitMQ" + ] + }, + { + "id": "streaming", + "name": "Stream Processing Platform", + "description": "This criterion indicates which stream processing solutions can trigger functions on a given FaaS platform.", + "exampleValues": [ + "AWS Kinesis", + "Apache Kafka" + ] + }, + { + "id": "specService", + "name": "Special Purpose Services", + "description": "This criterion indicates which special-purpose services can trigger functions on a given FaaS platform.", + "exampleValues": [ + "AWS Alexa", + "GitHub", + "IBM Watson" + ] + }, + { + "id": "eventSourceIntegration", + "name": "Event Sources Integration", + "description": "This criterion indicates how a given FaaS platform enables integration of custom event sources.", + "exampleValues": [ + "plugin-based", + "messaging-based" + ] + } + ] + }, + { + "id": "gFunctionOrchestration", + "locator": "function-orchestration", + "name": "Function Orchestration", + "criteria": [ + { + "id": "orchestrator", + "name": "Function Orchestrator", + "description": "This criterion indicates whether a function orchestrator can be used with a given FaaS platform.", + "exampleValues": [ + "AWS Step Functions", + "Azure Durable Functions" + ] + }, + { + "id": "workflowDefType", + "name": "Function Workflows Definition", + "description": "This criterion indicates how workflow are defined using a given function orchestrator.", + "exampleValues": [ + "standard workflow definition language", + "custom DSL", + "orchestrating function" + ] + }, + { + "id": "workflowDefLang", + "name": "Orchestrating Function Languages", + "description": "This criterion indicates which programming languages can be used to define workflows using a given function orchestrator.", + "exampleValues": [ + "JavaScript", + "Python" + ] + }, + { + "id": "controlFlowDocs", + "name": "Control Flow Constructs Documentation", + "description": "This criterion indicates whether a given function orchestrator provides teh documentation on control flow constructs.", + "exampleValues": [ + "true", + "false" + ] + } + ], + "criteriaGroupings": [ + { + "id": "gOrchestratorQuotas", + "locator": "orchestrator-quotas", + "name": "Quotas", + "criteria": [ + { + "id": "orchExecTimeQuotas", + "name": "Function Workflow Execution Time Quota", + "description": "This criterion indicates whether a given function orchestrator has quotas on workflow execution time.", + "exampleValues": [ + "true", + "false" + ] + }, + { + "id": "orchIOQuotas", + "name": "Function Workflow Task I/O Size Quota", + "description": "This criterion indicates whether a given function orchestrator has quotas on workflow tasks' I/O size.", + "exampleValues": [ + "true", + "false" + ] + } + ] + } + ] + }, + { + "id": "gTestingDebugging", + "locator": "testing-debugging", + "name": "Testing and Debugging", + "criteriaGroupings": [ + { + "id": "gTesting", + "locator": "testing", + "name": "Testing", + "criteria": [ + { + "id": "testingFunc", + "name": "Tools for Functional Testing", + "description": "This criterion indicates which tools for functional testing a given platform supports.", + "exampleValues": [ + "platform-native tooling", + "3rd party tooling" + ] + }, + { + "id": "testingNonFunc", + "name": "Tools for Non-Functional Testing", + "description": "This criterion indicates which tools for non-functional testing a given platform supports.", + "exampleValues": [ + "platform-native tooling", + "3rd party tooling" + ] + } + ] + }, + { + "id": "gDebugging", + "locator": "debugging", + "name": "Debugging", + "criteria": [ + { + "id": "debuggingLocal", + "name": "Local Debugging Tools", + "description": "This criterion indicates which tools for local debugging a given platform supports.", + "exampleValues": [ + "platform-native tooling", + "3rd party tooling" + ] + }, + { + "id": "debuggingRemote", + "name": "Remote Debugging Tools", + "description": "This criterion indicates which tools for remote debugging a given platform supports.", + "exampleValues": [ + "platform-native tooling", + "3rd party tooling" + ] + } + ] + } + ] + }, + { + "id": "gObservability", + "locator": "observability", + "name": "Observability", + "criteria": [ + { + "id": "logging", + "name": "Logging Tools", + "description": "This criterion indicates which logging tools a given platform supports.", + "exampleValues": [ + "platform-native tooling", + "3rd party tooling" + ] + }, + { + "id": "monitoring", + "name": "Monitoring Tools", + "description": "This criterion indicates which monitoring tools a given platform supports.", + "exampleValues": [ + "platform-native tooling", + "3rd party tooling" + ] + }, + { + "id": "obsIntegration", + "name": "Tooling Integration", + "description": "This criterion indicates whether a given platform supports integration of logging and monitoring tools.", + "exampleValues": [ + "push-based", + "pull-based", + "plugin-based" + ] + } + ] + }, + { + "id": "gAppDelivery", + "locator": "app-delivery", + "name": "Application Delivery", + "criteria": [ + { + "id": "depAutomation", + "name": "Deployment Automation", + "description": "This criterion indicates which deployment automation tools a given platform supports.", + "exampleValues": [ + "platform-native tooling", + "3rd party tooling" + ] + }, + { + "id": "cicd", + "name": "CI/CD Pipelining", + "description": "This criterion indicates whether a given platform documents support for CI/CD tools.", + "exampleValues": [ + "true", + "false" + ] + } + ] + }, + { + "id": "gCodeReuse", + "locator": "code-reuse", + "name": "Code Reuse", + "criteria": [ + { + "id": "funcMarketplaces", + "name": "Function Marketplace", + "description": "This criterion indicates whether a given FaaS platform has function or application examples available via a function marketplace.", + "exampleValues": [ + "official marketplace", + "3rd party marketplace" + ] + }, + { + "id": "funcSampleRepos", + "name": "Function Code Sample Repository", + "description": "This criterion indicates whether a given FaaS platform provides one or more repositories with code samples.", + "exampleValues": [ + "true", + "false" + ] + } + ] + }, + { + "id": "gAccessMgmt", + "locator": "access-mgmt", + "name": "Access Management", + "criteria": [ + { + "id": "auth", + "name": "Authentication", + "description": "This criterion indicates whether a given FaaS platform provides authentication mechanisms", + "exampleValues": [ + "built-in", + "external" + ] + }, + { + "id": "accessControl", + "name": "Access Control", + "description": "This criterion indicates whether a given FaaS platform provides access control mechanisms", + "exampleValues": [ + "functions", + "resources" + ] + } + ] + } + ] + } + ] + } +]