Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add tags and arn to rds records #80

Merged
merged 2 commits into from
Jul 19, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/main/scala/com/netflix/edda/Record.scala
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,12 @@ class Record(
val data: Any,
val tags: Map[String, Any]) {

/** append data **/
def append(newdata: Map[String,Any]): Record = {
val a = data.asInstanceOf[Map[String,Any]] ++ newdata
return new Record(id, ftime, ctime, stime, ltime, mtime, a, tags)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

copy(data = a)

}

/** copy to behave similar to case class */
def copy(
id: String = id,
Expand Down
11 changes: 11 additions & 0 deletions src/main/scala/com/netflix/edda/aws/AwsClient.scala
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ object AwsClient {
*/
class AwsClient(val provider: AWSCredentialsProvider, val region: String) {

var account = ""

/** uses [[http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/AWSCredentials.html com.amazonaws.auth.AWSCredentials]] to create AWSCredentialsProvider
*
* @param credentials used to connect to AWS services
Expand Down Expand Up @@ -93,6 +95,15 @@ class AwsClient(val provider: AWSCredentialsProvider, val region: String) {
this(AwsClient.mkCredentialProvider(accessKey,secretKey, ""), region)


/** generate a resource arn */
def arn(resourceAPI: String, resourceType: String, resourceName: String): String = {
"arn:aws:" + resourceAPI + ":" + region + ":" + account + ":" + resourceType + ":" + resourceName
}

def setAccountNum(accountNumber: String) {
this.account = accountNumber
}

/** get [[http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/ec2/AmazonEC2Client.html com.amazonaws.services.ec2.AmazonEC2Client]] object */
def ec2 = {
val client = new AmazonEC2Client(provider)
Expand Down
42 changes: 41 additions & 1 deletion src/main/scala/com/netflix/edda/aws/AwsCrawlers.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
package com.netflix.edda.aws

import scala.actors.Actor
import scala.collection.JavaConversions._

import com.netflix.edda.StateMachine
import com.netflix.edda.Crawler
Expand Down Expand Up @@ -43,6 +44,7 @@ import com.amazonaws.services.ec2.model.DescribeSubnetsRequest
import com.amazonaws.services.ec2.model.DescribeTagsRequest
import com.amazonaws.services.ec2.model.DescribeVolumesRequest

import com.amazonaws.services.identitymanagement.model.GetUserRequest
import com.amazonaws.services.identitymanagement.model.ListUsersRequest
import com.amazonaws.services.identitymanagement.model.ListAccessKeysRequest
import com.amazonaws.services.identitymanagement.model.ListGroupsForUserRequest
Expand Down Expand Up @@ -77,10 +79,13 @@ import java.util.concurrent.Callable

import org.slf4j.LoggerFactory
import com.amazonaws.services.rds.model.DescribeDBInstancesRequest
import com.amazonaws.services.rds.model.ListTagsForResourceRequest
import com.amazonaws.services.elasticache.model.DescribeCacheClustersRequest
import com.amazonaws.services.cloudformation.model.DescribeStacksRequest
import com.amazonaws.services.cloudformation.model.ListStackResourcesRequest

import scala.collection.mutable.ListBuffer

/** static namespace for out Context trait */
object AwsCrawler {

Expand Down Expand Up @@ -125,6 +130,8 @@ trait AwsBeanMapper extends BeanMapper {
flattenTag(basicBeanMapper.fromBean(obj).asInstanceOf[Map[String,Any]])
case obj : com.amazonaws.services.autoscaling.model.TagDescription =>
flattenTag(basicBeanMapper.fromBean(obj).asInstanceOf[Map[String,Any]])
case obj : com.amazonaws.services.rds.model.Tag =>
flattenTag(basicBeanMapper.fromBean(obj).asInstanceOf[Map[String,Any]])
}
this.addObjMapper(tagObjMapper)

Expand Down Expand Up @@ -945,7 +952,40 @@ class AwsDatabaseCrawler(val name: String, val ctx: AwsCrawler.Context) extends
}).toList
}
}
val list = it.toList.flatten

var account = ""
val r = """^.*arn:aws:[a-z]+::([0-9]{12}):.*$""".r
try {
val userRequest = new GetUserRequest()
val iam = ctx.awsClient.identitymanagement.getUser(userRequest).getUser().getArn()
var account = (for (r(a) <- r.findFirstIn(iam.toString)) yield a).getOrElse("")
ctx.awsClient.setAccountNum(account)
} catch {
case e: Exception => {
val msg = e.getMessage
var account = (for (r(a) <- r.findFirstIn(msg)) yield a).getOrElse("")
ctx.awsClient.setAccountNum(account)
}
}

val initial = it.toList.flatten
var buffer = new ListBuffer[Record]()
for (rec <- initial) {
val data = rec.toMap("data").asInstanceOf[Map[String,String]]
val arn = ctx.awsClient.arn("rds", "db",data("DBInstanceIdentifier"))
val arnMap = Map("arn" -> arn)

val request = new ListTagsForResourceRequest().withResourceName(arn)
val response = ctx.awsClient.rds.listTagsForResource(request)
val responseList = response.getTagList.asScala.map(
item => {
ctx.beanMapper(item)
}).toList
val tags = Map("tags" -> responseList)

buffer += rec.append(arnMap).append(tags)
}
val list = buffer.toList
list
}
}
Expand Down