Skip to content

Commit

Permalink
Fix for Expose DaemonSet transformer state linkerd#2149. Linkerd's cu…
Browse files Browse the repository at this point in the history
…rrent view of each DaemonSet namer will be exposed to :9990/namer_state//io.l5d.k8s.daemonset/// , where namespace/port/service are the required config for the DaemonSet transformer.

Signed-off-by: dst4096 <[email protected]>
  • Loading branch information
dtacalau committed Oct 14, 2019
1 parent 2097828 commit adb8434
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,13 @@ case class DaemonSetTransformerConfig(
override def mk(params: Params): NameTreeTransformer = {
val client = mkClient(params).configured(param.Label("client"))
def mkNs(ns: String) = Api(client.newService(dst)).withNamespace(ns)
val namer = new MultiNsNamer(Path.empty, None, mkNs)

val namer = new MultiNsNamer(prefix, None, mkNs)

val daemonSet = namer.bind(NameTree.Leaf(Path.Utf8(namespace, port, service)))
if (hostNetwork.getOrElse(false))
new MetadataGatewayTransformer(prefix, daemonSet, Metadata.nodeName)
new MetadataGatewayTransformer(prefix, daemonSet, Metadata.nodeName, namer.adminHandlers)
else
new SubnetGatewayTransformer(prefix, daemonSet, Netmask("255.255.255.0"))
new SubnetGatewayTransformer(prefix, daemonSet, Netmask("255.255.255.0"), namer.adminHandlers)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package io.buoyant.transformer

import com.twitter.finagle.Name.Bound
import com.twitter.finagle._
import com.twitter.finagle.naming.NameInterpreter
import com.twitter.util.{Activity, Future, Var}
import io.buoyant.admin.Admin
import io.buoyant.namer.{DelegateTree, DelegatingNameTreeTransformer, RichActivity}

/**
Expand All @@ -12,23 +14,29 @@ import io.buoyant.namer.{DelegateTree, DelegatingNameTreeTransformer, RichActivi
class SubnetGatewayTransformer(
prefix: Path,
gatewayTree: Activity[NameTree[Bound]],
netmask: Netmask
) extends GatewayTransformer(prefix, gatewayTree, netmask.local)
netmask: Netmask,
handlers: Seq[Admin.Handler] = Seq.empty
) extends GatewayTransformer(prefix, gatewayTree, netmask.local, handlers)

class MetadataGatewayTransformer(
prefix: Path,
gatewayTree: Activity[NameTree[Bound]],
metadataField: String
metadataField: String,
handlers: Seq[Admin.Handler] = Seq.empty
) extends GatewayTransformer(prefix, gatewayTree, {
case (Address.Inet(_, a), Address.Inet(_, b)) => a.get(metadataField) == b.get(metadataField)
case _ => true
})
},
handlers)

class GatewayTransformer(
prefix: Path,
gatewayTree: Activity[NameTree[Bound]],
gatewayPredicate: (Address, Address) => Boolean
) extends DelegatingNameTreeTransformer {
gatewayPredicate: (Address, Address) => Boolean,
handlers: Seq[Admin.Handler] = Seq.empty
) extends DelegatingNameTreeTransformer with Admin.WithHandlers {

override def adminHandlers: Seq[Admin.Handler] = handlers

override protected def transformDelegate(tree: DelegateTree[Bound]): Future[DelegateTree[Bound]] =
gatewayTree.toFuture.map { gateways =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import com.twitter.server.handler.ResourceHandler
import io.buoyant.admin.Admin.{Handler, NavItem}
import io.buoyant.admin.names.{BoundNamesHandler, DelegateApiHandler, DelegateHandler}
import io.buoyant.admin.{Admin, ConfigHandler, StaticFilter, _}
import io.buoyant.namer.EnumeratingNamer
import io.buoyant.namer.{EnumeratingNamer, WithNameTreeTransformer}
import io.buoyant.router.{Http, RoutingFactory}

object LinkerdAdmin {
Expand Down Expand Up @@ -83,6 +83,21 @@ object LinkerdAdmin {
}
}

def extractTransformersNamerHandlers(namers: Seq[Namer]): Seq[Admin.Handler] = {
namers.flatMap { namer =>
namer match {
case withNameTreeTransformer: WithNameTreeTransformer =>
withNameTreeTransformer.transformer match {
case withHandlers: Admin.WithHandlers => {
withHandlers.adminHandlers
}
case _ => Nil
}
case _ => Nil
}
}
}

def extractInterpreterHandlers(routers: Seq[Router]): Seq[Admin.Handler] = {
routers.flatMap { router =>
router.interpreter match {
Expand Down Expand Up @@ -119,7 +134,8 @@ object LinkerdAdmin {
linker.namers.map(_._2) ++
linker.routers ++
linker.telemeters
) ++ extractInterpreterHandlers(linker.routers))
) ++ extractTransformersNamerHandlers(linker.namers.map(_._2))
++ extractInterpreterHandlers(linker.routers))
.map {
case Handler(url, service, css) =>
val adminFilter = new AdminFilter(adminHandler, css)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,18 @@ import com.twitter.finagle.naming.NameInterpreter
import com.twitter.finagle._
import com.twitter.util.{Activity, Future}
import io.buoyant.admin.Admin
import io.buoyant.admin.Admin.Handler

/**
* A NameTreeTransformer performs some kind of transformation on bound
* NameTrees. These transformers are generally applied to the output of a
* NameInterpreter to do post-processing.
*/

trait WithNameTreeTransformer {
def transformer: NameTreeTransformer
}

trait NameTreeTransformer {

protected def transform(tree: NameTree[Name.Bound]): Activity[NameTree[Name.Bound]]
Expand All @@ -29,7 +35,9 @@ trait NameTreeTransformer {
}
}

def wrap(underlying: Namer): Namer = new Namer with Admin.WithHandlers {
def getSelf(): NameTreeTransformer = this

def wrap(underlying: Namer): Namer = new Namer with Admin.WithHandlers with WithNameTreeTransformer {
private[this] def isBound(tree: NameTree[Name]): Boolean = {
tree match {
case NameTree.Neg | NameTree.Empty | NameTree.Fail => true
Expand All @@ -49,6 +57,8 @@ trait NameTreeTransformer {
}
}

override def transformer: NameTreeTransformer = { getSelf() }

override def adminHandlers: Seq[Admin.Handler] = underlying match {
case withHandlers: Admin.WithHandlers => withHandlers.adminHandlers
case _ => Nil
Expand Down

0 comments on commit adb8434

Please sign in to comment.