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

Supporting custom env vars for connections + Service Bus binding bug fixes #1

Merged
merged 6 commits into from Nov 29, 2019
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 4 additions & 0 deletions Sources/AzureFunctions/AzureFunction.swift
Expand Up @@ -58,6 +58,10 @@ open class Function {
throw FunctionError.FunctionTypeNotImplementedException("Please override the right exec function for your trigger")
}

open func exec(sbMessage: ServiceBusMessage, context: inout Context, callback: @escaping callback) throws {
throw FunctionError.FunctionTypeNotImplementedException("Please override the right exec function for your trigger")
}

}

internal extension Function {
Expand Down
2 changes: 1 addition & 1 deletion Sources/AzureFunctions/Bindings/BindingFactory.swift
Expand Up @@ -51,7 +51,7 @@ internal final class BindingFactory {

let sbMsg = ServiceBusMessage()
sbMsg.name = sb.name
sbMsg.data = try RpcConverter.fromTypedData(data: binding.data)
sbMsg.message = try RpcConverter.fromTypedData(data: binding.data, preferJsonInString: true)
sbMsg.queueName = sb.queueName
sbMsg.topicName = sb.topicName
sbMsg.subscriptionName = sb.subscriptionName
Expand Down
4 changes: 2 additions & 2 deletions Sources/AzureFunctions/Bindings/ServiceBusMessage.swift
Expand Up @@ -14,7 +14,7 @@ public class ServiceBusMessage: Binding {
public var topicName: String?
public var subscriptionName: String?
public var connection: String = ""
public var data: Any?
public var message: Any?
public var properties: [String:String] = [:]

internal init() {
Expand All @@ -29,7 +29,7 @@ public class ServiceBusMessage: Binding {

public init(name: String, topicName: String, subscriptionName: String, connection: String) {
self.name = name
self.queueName = topicName
self.topicName = topicName
self.subscriptionName = subscriptionName
self.connection = connection
}
Expand Down
5 changes: 4 additions & 1 deletion Sources/AzureFunctions/Broker.swift
Expand Up @@ -14,7 +14,7 @@ internal class Broker {
// handle empty input!!

guard let inputBinding = input else {
throw FunctionError.internalInconsistancyException("Cannot determin Function Input")
throw FunctionError.internalInconsistancyException("Nil Function Input")
}

switch inputBinding {
Expand All @@ -27,6 +27,9 @@ internal class Broker {
case let blob as Blob:
try function.exec(blob: blob, context: &context, callback: callback)
break
case let sbMsg as ServiceBusMessage:
try function.exec(sbMessage: sbMsg, context: &context, callback: callback)
break
case let data as Data:
try function.exec(data: data, context: &context, callback: callback)
break
Expand Down
26 changes: 20 additions & 6 deletions Sources/AzureFunctions/CodeGen.swift
Expand Up @@ -24,7 +24,6 @@ internal struct CodeGen {
let rootFolder = try Folder.init(path: rootDir)


print("Creating host.json")
let hostRes: String
if debug {
hostRes = try environment.renderTemplate(string: Templates.ProjectFiles.hostJsonDebug, context: nil)
Expand All @@ -33,20 +32,35 @@ internal struct CodeGen {
}
let hostFile = try rootFolder.createFile(named: "host.json")
try hostFile.write(hostRes)


print("Creating local.settings.json")
let localSetRes: String

if let storage = registry.AzureWebJobsStorage {
if var envVars = registry.EnvironmentVariables, envVars.count > 0 {
if let storage = registry.AzureWebJobsStorage {
envVars["AzureWebJobsStorage"] = storage
}

var envVarsString = ""
for setting in envVars {
envVarsString.append("\"\(setting.key)\": \"\(setting.value)\",")
}

localSetRes = try environment.renderTemplate(string: Templates.ProjectFiles.localSettingsJson, context: ["envVars": envVarsString])

} else if let storage = registry.AzureWebJobsStorage {
localSetRes = try environment.renderTemplate(string: Templates.ProjectFiles.localSettingsJson, context: ["envVars": "\"AzureWebJobsStorage\": \"\(storage)\""])
} else {
localSetRes = try environment.renderTemplate(string: Templates.ProjectFiles.localSettingsJson, context: nil)
localSetRes = try environment.renderTemplate(string: Templates.ProjectFiles.localSettingsJson, context: nil)
}
// if let storage = registry.AzureWebJobsStorage {
// localSetRes = try environment.renderTemplate(string: Templates.ProjectFiles.localSettingsJson, context: ["envVars": "\"AzureWebJobsStorage\": \"\(storage)\""])
// } else {
// localSetRes = try environment.renderTemplate(string: Templates.ProjectFiles.localSettingsJson, context: nil)
// }

let localSetFile = try rootFolder.createFile(named: "local.settings.json")
try localSetFile.write(localSetRes)

print("Creating worker.config.json")
let workersFolder = try rootFolder.createSubfolderIfNeeded(withName: "workers")
let swiftFolder = try workersFolder.createSubfolderIfNeeded(withName: "swift")
let workerRes = try environment.renderTemplate(string: Templates.ProjectFiles.workerConfigJson, context: ["execPath": "\(swiftFolder.path)functions"])
Expand Down
7 changes: 7 additions & 0 deletions Sources/AzureFunctions/FunctionRegistry.swift
Expand Up @@ -14,13 +14,20 @@ public final class FunctionRegistry {
private var functionsInfo: [String: FunctionInfo] = [:]

public var AzureWebJobsStorage: String?
public var EnvironmentVariables: [String: String]?


public init() { }

public init(AzureWebJobsStorage: String) {
self.AzureWebJobsStorage = AzureWebJobsStorage
}

public init(AzureWebJobsStorage: String, EnvironmentVariables: [String: String]) {
self.AzureWebJobsStorage = AzureWebJobsStorage
self.EnvironmentVariables = EnvironmentVariables
}

public func register(_ function: Function.Type) {
let fun = function.init()
self.functionsByName[fun.name] = fun
Expand Down
17 changes: 14 additions & 3 deletions Sources/AzureFunctions/RpcConverter.swift
Expand Up @@ -63,7 +63,7 @@ internal final class RpcConverter {
return td
}

static func fromTypedData(data: AzureFunctionsRpcMessages_TypedData) throws -> Any? {
static func fromTypedData(data: AzureFunctionsRpcMessages_TypedData, preferJsonInString: Bool = false) throws -> Any? {
var converted: Any?

switch data.data {
Expand All @@ -72,7 +72,6 @@ internal final class RpcConverter {
converted = httpReq
break
case let .some(.json(jsonStr)):
Logger.log("TD JSON \(jsonStr)")
if let data = jsonStr.data(using: .utf8) {
do {
converted = try JSONSerialization.jsonObject(with: data, options: [])
Expand All @@ -96,7 +95,19 @@ internal final class RpcConverter {
converted = data
break
case let .some(.string(string)):
converted = string
if !preferJsonInString {
converted = string
} else {
if let data = string.data(using: .utf8) {
if string.starts(with: "[") {
converted = try? JSONSerialization.jsonObject(with: data, options: []) as? [[String: String]] ?? string
} else {
converted = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: String] ?? string
}
} else {
converted = string
}
}
break
case let .some(.double(double)):
converted = double
Expand Down
7 changes: 2 additions & 5 deletions Sources/AzureFunctions/Worker.swift
Expand Up @@ -98,9 +98,9 @@ extension Worker {
}

func workerInitRequest(requestId: String, msg: AzureFunctionsRpcMessages_WorkerInitRequest) {
Logger.log("Responding to init request")

var res = AzureFunctionsRpcMessages_WorkerInitResponse()
res.workerVersion = "0.0.4"
res.workerVersion = "0.1.0"
res.capabilities = ["TypedDataCollection": "TypedDataCollection"] //["RpcHttpBodyOnly": "true"

var stRes = AzureFunctionsRpcMessages_StatusResult.init()
Expand Down Expand Up @@ -144,8 +144,6 @@ extension Worker {

func functionLoadRequest(requestId: String, msg: AzureFunctionsRpcMessages_FunctionLoadRequest) {

Logger.log("Responding to func load request for \(msg.functionID)")

var res = AzureFunctionsRpcMessages_FunctionLoadResponse()
res.functionID = msg.functionID

Expand Down Expand Up @@ -174,7 +172,6 @@ extension Worker {
}

func invocationRequest(requestId: String, msg: AzureFunctionsRpcMessages_InvocationRequest) throws {
Logger.log("Responding to func invocation request")

var res = AzureFunctionsRpcMessages_InvocationResponse()
res.invocationID = msg.invocationID
Expand Down