Skip to content

Commit 9ee745b

Browse files
committed
Change prewarm container
- Add prewarm container - Delete prewarm container - Add test case
1 parent b3a3ef4 commit 9ee745b

File tree

18 files changed

+459
-66
lines changed

18 files changed

+459
-66
lines changed

ansible/group_vars/all

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ controller:
8888
authentication:
8989
spi: "{{ controller_authentication_spi | default('') }}"
9090
loglevel: "{{ controller_loglevel | default(whisk_loglevel) | default('INFO') }}"
91+
username: "{{ controller_username | default(operation.username) }}"
92+
password: "{{ controller_password | default(operation.password) }}"
9193
entitlement:
9294
spi: "{{ controller_entitlement_spi | default('') }}"
9395
protocol: "{{ controller_protocol | default('https') }}"
@@ -183,6 +185,8 @@ invoker:
183185
docker:
184186
become: "{{ invoker_docker_become | default(false) }}"
185187
loglevel: "{{ invoker_loglevel | default(whisk_loglevel) | default('INFO') }}"
188+
username: "{{ invoker_username | default(operation.username) }}"
189+
password: "{{ invoker_password | default(operation.password) }}"
186190
jmxremote:
187191
jvmArgs: "{% if inventory_hostname in groups['invokers'] %}
188192
{{ jmx.jvmCommonArgs }} -Djava.rmi.server.hostname={{ invokerHostname }} -Dcom.sun.management.jmxremote.rmi.port={{ jmx.rmiBasePortInvoker + groups['invokers'].index(inventory_hostname) }} -Dcom.sun.management.jmxremote.port={{ jmx.basePortInvoker + groups['invokers'].index(inventory_hostname) }}
@@ -379,3 +383,8 @@ metrics:
379383
port: "{{ metrics_kamon_statsd_port | default('8125') }}"
380384

381385
user_events: "{{ user_events_enabled | default(false) }}"
386+
387+
# Operation configuation
388+
operation:
389+
username: "{{ operation_username | default('admin') }}"
390+
password: "{{ operation_password | default('admin') }}"

ansible/roles/controller/tasks/deploy.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,18 @@
5757
dest: "{{ controller.confdir }}/{{ controller_name }}/jmxremote.access"
5858
mode: 0777
5959

60+
- name: copy controller auth username file
61+
template:
62+
src: "controllerauth.username.j2"
63+
dest: "{{ controller.confdir }}/{{ controller_name }}/controllerauth.username"
64+
mode: 0777
65+
66+
- name: copy controller auth password file
67+
template:
68+
src: "controllerauth.password.j2"
69+
dest: "{{ controller.confdir }}/{{ controller_name }}/controllerauth.password"
70+
mode: 0777
71+
6072
- name: "copy kafka truststore/keystore"
6173
when: kafka.protocol == 'SSL'
6274
copy:

ansible/roles/invoker/tasks/deploy.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,18 @@
159159
dest: "{{ invoker.confdir }}/{{ invoker_name }}/jmxremote.access"
160160
mode: 0777
161161

162+
- name: copy invoker auth username file
163+
template:
164+
src: "invokerauth.username.j2"
165+
dest: "{{ invoker.confdir }}/invoker{{ groups['invokers'].index(inventory_hostname) }}/invokerauth.username"
166+
mode: 0777
167+
168+
- name: copy invoker auth password file
169+
template:
170+
src: "invokerauth.password.j2"
171+
dest: "{{ invoker.confdir }}/invoker{{ groups['invokers'].index(inventory_hostname) }}/invokerauth.password"
172+
mode: 0777
173+
162174
- name: add additional jvm params if jmxremote is enabled
163175
when: jmx.enabled
164176
set_fact:
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{{ controller.password }}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{{ controller.username }}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{{ invoker.password }}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{{ invoker.username }}

common/scala/src/main/scala/org/apache/openwhisk/core/connector/Message.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,3 +282,12 @@ object EventMessage extends DefaultJsonProtocol {
282282

283283
def parse(msg: String) = format.read(msg.parseJson)
284284
}
285+
286+
case class RuntimeMessage(runtime: String, operType: String) extends Message {
287+
override def serialize = RuntimeMessage.serdes.write(this).compactPrint
288+
}
289+
290+
object RuntimeMessage extends DefaultJsonProtocol {
291+
def parse(msg: String) = Try(serdes.read(msg.parseJson))
292+
implicit val serdes = jsonFormat(RuntimeMessage.apply _, "runtime", "operType")
293+
}

common/scala/src/main/scala/org/apache/openwhisk/core/entity/ExecManifest.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,14 @@ protected[core] object ExecManifest {
5353
mf
5454
}
5555

56+
protected[core] def initializePrewarm(prewarmRuntime: String): Try[Runtimes] = {
57+
val rmc = loadConfigOrThrow[RuntimeManifestConfig](ConfigKeys.runtimes)
58+
val mf = Try(prewarmRuntime.parseJson.asJsObject).flatMap(runtimes(_, rmc))
59+
var manifest: Option[Runtimes] = None
60+
mf.foreach(m => manifest = Some(m))
61+
mf
62+
}
63+
5664
/**
5765
* Gets existing runtime manifests.
5866
*

core/controller/src/main/scala/org/apache/openwhisk/core/controller/Controller.scala

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ import akka.Done
2121
import akka.actor.{ActorSystem, CoordinatedShutdown}
2222
import akka.event.Logging.InfoLevel
2323
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
24-
import akka.http.scaladsl.model.Uri
24+
import akka.http.scaladsl.model.{StatusCodes, Uri}
25+
import akka.http.scaladsl.model.headers.BasicHttpCredentials
2526
import akka.http.scaladsl.server.Route
2627
import akka.stream.ActorMaterializer
2728
import kamon.Kamon
@@ -78,6 +79,17 @@ class Controller(val instance: ControllerInstanceId,
7879
implicit val logging: Logging)
7980
extends BasicRasService {
8081

82+
val controllerUsername = {
83+
val source = scala.io.Source.fromFile("/conf/controllerauth.username");
84+
try source.mkString.replaceAll("\r|\n", "")
85+
finally source.close()
86+
}
87+
val controllerPassword = {
88+
val source = scala.io.Source.fromFile("/conf/controllerauth.password");
89+
try source.mkString.replaceAll("\r|\n", "")
90+
finally source.close()
91+
}
92+
8193
TransactionId.controller.mark(
8294
this,
8395
LoggingMarkers.CONTROLLER_STARTUP(instance.asString),
@@ -95,7 +107,7 @@ class Controller(val instance: ControllerInstanceId,
95107
(pathEndOrSingleSlash & get) {
96108
complete(info)
97109
}
98-
} ~ apiV1.routes ~ swagger.swaggerRoutes ~ internalInvokerHealth
110+
} ~ apiV1.routes ~ swagger.swaggerRoutes ~ internalInvokerHealth ~ changeRuntime
99111
}
100112

101113
// initialize datastores
@@ -154,6 +166,38 @@ class Controller(val instance: ControllerInstanceId,
154166
}
155167
}
156168

169+
/**
170+
* Handles POST/DELETE prewarm container
171+
*/
172+
private val changeRuntime = {
173+
implicit val executionContext = actorSystem.dispatcher
174+
(path("prewarmContainer") & (post | delete)) {
175+
extractCredentials {
176+
case Some(BasicHttpCredentials(username, password)) =>
177+
if (username == controllerUsername && password == controllerPassword) {
178+
extractMethod { method =>
179+
entity(as[String]) { prewarmRuntime =>
180+
val execManifest = ExecManifest.initializePrewarm(prewarmRuntime)
181+
if (execManifest.isFailure) {
182+
logging.error(
183+
this,
184+
s"Received invalid prewarm runtimes manifest with ${method.name} request:${execManifest.failed.get}")
185+
complete(s"Received invalid prewarm runtimes manifest with ${method.name} request")
186+
} else {
187+
logging.info(this, s"Received valid prewarm runtimes manifest with ${method.name} request")
188+
loadBalancer.sendRuntimeToManageInvoker(prewarmRuntime, method.name)
189+
complete(s"Change prewarm container request with ${method.name} is already sent to managed invokers")
190+
}
191+
}
192+
}
193+
} else {
194+
complete("username or password is wrong")
195+
}
196+
case _ => complete(StatusCodes.Unauthorized)
197+
}
198+
}
199+
}
200+
157201
// controller top level info
158202
private val info = Controller.info(
159203
whiskConfig,

0 commit comments

Comments
 (0)