aboutsummaryrefslogtreecommitdiffstats
path: root/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/generator/CpsGenerator.xtend
diff options
context:
space:
mode:
Diffstat (limited to 'Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/generator/CpsGenerator.xtend')
-rw-r--r--Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/generator/CpsGenerator.xtend117
1 files changed, 117 insertions, 0 deletions
diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/generator/CpsGenerator.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/generator/CpsGenerator.xtend
new file mode 100644
index 00000000..e8d29949
--- /dev/null
+++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/generator/CpsGenerator.xtend
@@ -0,0 +1,117 @@
1package hu.bme.mit.inf.dslreasoner.domains.cps.generator
2
3import hu.bme.mit.inf.dslreasoner.domains.cps.CpsFactory
4import hu.bme.mit.inf.dslreasoner.domains.cps.CyberPhysicalSystem
5import hu.bme.mit.inf.dslreasoner.domains.cps.HostType
6import java.util.Collection
7import java.util.Random
8import org.eclipse.emf.common.util.URI
9import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl
10
11class CpsGenerator {
12 extension val CpsFactory = CpsFactory.eINSTANCE
13
14 static val MIN_MEMORY = 1
15 static val MAX_MEMORY = 6
16 static val MIN_HDD = 1
17 static val MAX_HDD = 30
18 static val HIGH_CPU_FRACTION = 4
19 static val MIN_REPLICAS = 1
20 static val MAX_REPLICAS = 4
21
22 val Random random
23 val int applicationTypeCount
24 val int demandFactor
25 val boolean populateAppInstances
26
27 new(long randomSeed, int applicationTypeCount, int demandFactor) {
28 this(randomSeed, applicationTypeCount, demandFactor, false)
29 }
30
31 new(long randomSeed, int applicationTypeCount, int demandFactor, boolean populateAppInstances) {
32 this.random = new Random(randomSeed)
33 this.applicationTypeCount = applicationTypeCount
34 this.demandFactor = demandFactor
35 this.populateAppInstances = populateAppInstances
36 }
37
38 def generateCpsProblem() {
39 val resourceSet = new ResourceSetImpl
40 val resource = resourceSet.createResource(URI.createFileURI("dummy.dummyext"))
41 createCyberPhysicalSystem => [
42 val cps = it
43 resource.contents += cps
44 createLowCpuHostTypes
45 val highCpuHostTypes = createHighCpuHostTypes
46 for (var int i = 0; i < applicationTypeCount; i++) {
47 if (i % HIGH_CPU_FRACTION == 0) {
48 createRandomApplicationType(highCpuHostTypes)
49 } else {
50 createRandomApplicationType(hostTypes)
51 }
52 }
53 for (var int i = 0; i < demandFactor; i++) {
54 requests += createRequest => [
55 for (appType : cps.applicationTypes) {
56 requirements += createRequirement => [
57 count = nextInt(CpsGenerator.MIN_REPLICAS, CpsGenerator.MAX_REPLICAS)
58 type = appType
59 if (populateAppInstances) {
60 for (j : 0 ..< count) {
61 val app = createApplicationInstance
62 app.type = appType
63 appType.instances += app
64 instances += app
65 }
66 }
67 ]
68 }
69 ]
70 }
71 ]
72 }
73
74 private def void createRandomApplicationType(CyberPhysicalSystem it, Collection<HostType> allowedHostTypes) {
75 val appType = createApplicationType
76 val memory = nextInt(MIN_MEMORY, MAX_MEMORY)
77 val hdd = nextInt(MIN_HDD, MAX_HDD)
78 for (hostType : allowedHostTypes) {
79 appType.requirements += createResourceRequirement => [
80 it.hostType = hostType
81 requiredMemory = memory
82 requiredHdd = hdd
83 ]
84 }
85 applicationTypes += appType
86 }
87
88 private def createLowCpuHostTypes(CyberPhysicalSystem it) {
89 #[
90 createHostType(2, 8, 75), // m5d.large
91 createHostType(4, 16, 150), // m5d.xlarge
92 createHostType(3, 16, 75), // r5d.large
93 createHostType(6, 32, 150) // r5d.xlarge
94 ]
95 }
96
97 private def createHighCpuHostTypes(CyberPhysicalSystem it) {
98 #[
99 createHostType(2, 4, 50), // c5d.large
100 createHostType(4, 8, 100) // c5d.xlarge
101 ]
102 }
103
104 private def createHostType(CyberPhysicalSystem it, int cost, int memory, int hdd) {
105 val hostType = createHostType => [
106 it.cost = cost
107 defaultMemory = memory
108 defaultHdd = hdd
109 ]
110 hostTypes += hostType
111 hostType
112 }
113
114 private def nextInt(int lower, int upper) {
115 lower + random.nextInt(upper - lower + 1)
116 }
117}