From 80b4d6a665971d2c2e67a8ee34717a3bad1c39bf Mon Sep 17 00:00:00 2001 From: David Sulpy Date: Mon, 14 Sep 2015 16:16:21 -0500 Subject: [PATCH 1/4] removed functions from uninstall that may have been causing errors during the uninstall process; added an initializer for the atomicState.eventBuffer on update if it's whiped away; added a check for access key in createBucket to make the function more idempotent --- .../initial-state-event-streamer.groovy | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/smartapps/initialstate-events/initial-state-event-streamer.src/initial-state-event-streamer.groovy b/smartapps/initialstate-events/initial-state-event-streamer.src/initial-state-event-streamer.groovy index d82ccb3..502178a 100644 --- a/smartapps/initialstate-events/initial-state-event-streamer.src/initial-state-event-streamer.groovy +++ b/smartapps/initialstate-events/initial-state-event-streamer.src/initial-state-event-streamer.groovy @@ -242,22 +242,26 @@ def updated() { if (atomicState.bucketKey != null && atomicState.accessKey != null) { atomicState.isBucketCreated = false } - + if (atomicState.eventBuffer == null) { + atomicState.eventBuffer = []; + } + subscribeToEvents() log.debug "updated (version $atomicState.version)" } def uninstalled() { - unsubscribe() - unschedule() log.debug "uninstalled (version $atomicState.version)" } def createBucket() { if (!atomicState.bucketName) { - atomicState.bucketName = atomicState.bucketKey + atomicState.bucketName = atomicState.bucketKey; + } + if (!atomicState.accessKey) { + return; } def bucketName = "${atomicState.bucketName}" def bucketKey = "${atomicState.bucketKey}" From bad978afbd378e09666c9a982cc01b15011dd3cc Mon Sep 17 00:00:00 2001 From: David Sulpy Date: Mon, 14 Sep 2015 16:19:30 -0500 Subject: [PATCH 2/4] removed all simicolons as per the groovy-lang.org style guide and better consistency --- .../initial-state-event-streamer.groovy | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/smartapps/initialstate-events/initial-state-event-streamer.src/initial-state-event-streamer.groovy b/smartapps/initialstate-events/initial-state-event-streamer.src/initial-state-event-streamer.groovy index 502178a..ae178f2 100644 --- a/smartapps/initialstate-events/initial-state-event-streamer.src/initial-state-event-streamer.groovy +++ b/smartapps/initialstate-events/initial-state-event-streamer.src/initial-state-event-streamer.groovy @@ -229,7 +229,7 @@ def installed() { atomicState.isBucketCreated = false atomicState.grokerSubdomain = "groker" - atomicState.eventBuffer = []; + atomicState.eventBuffer = [] runEvery15Minutes(flushBuffer) @@ -243,7 +243,7 @@ def updated() { atomicState.isBucketCreated = false } if (atomicState.eventBuffer == null) { - atomicState.eventBuffer = []; + atomicState.eventBuffer = [] } subscribeToEvents() @@ -258,10 +258,10 @@ def uninstalled() { def createBucket() { if (!atomicState.bucketName) { - atomicState.bucketName = atomicState.bucketKey; + atomicState.bucketName = atomicState.bucketKey } if (!atomicState.accessKey) { - return; + return } def bucketName = "${atomicState.bucketName}" def bucketKey = "${atomicState.bucketKey}" @@ -321,23 +321,23 @@ def genericHandler(evt) { def flushBuffer() { log.trace "About to flush the buffer on schedule" if (atomicState.eventBuffer != null && atomicState.eventBuffer.size() > 0) { - shipEvents(); + shipEvents() } } def eventHandler(name, value) { - log.debug atomicState.eventBuffer; + log.debug atomicState.eventBuffer - def eventBuffer = atomicState.eventBuffer; - def epoch = now() / 1000; + def eventBuffer = atomicState.eventBuffer + def epoch = now() / 1000 eventBuffer << [key: "$name", value: "$value", epoch: "$epoch"] - log.debug eventBuffer; + log.debug eventBuffer - atomicState.eventBuffer = eventBuffer; + atomicState.eventBuffer = eventBuffer if (eventBuffer.size() >= 10) { - shipEvents(); + shipEvents() } } @@ -352,7 +352,7 @@ def shipEvents() { "Accept-Version": "0.0.2" ], body: atomicState.eventBuffer - ]; + ] try { // post the events to initial state @@ -362,7 +362,7 @@ def shipEvents() { log.error "shipping failed... ${resp.data}" } else { // clear the buffer - atomicState.eventBuffer = []; + atomicState.eventBuffer = [] } } } catch (e) { From 1adb4000a64269e2335e4e1325574674af550dac Mon Sep 17 00:00:00 2001 From: David Sulpy Date: Mon, 14 Sep 2015 16:30:40 -0500 Subject: [PATCH 3/4] refactored the methods for creating buckets and sending events to be more idempotent friendly; called tryCreateBucket on bucketKey setting to create the bucket sooner in the workflow than an events shipment --- .../initial-state-event-streamer.groovy | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/smartapps/initialstate-events/initial-state-event-streamer.src/initial-state-event-streamer.groovy b/smartapps/initialstate-events/initial-state-event-streamer.src/initial-state-event-streamer.groovy index ae178f2..d1ccf79 100644 --- a/smartapps/initialstate-events/initial-state-event-streamer.src/initial-state-event-streamer.groovy +++ b/smartapps/initialstate-events/initial-state-event-streamer.src/initial-state-event-streamer.groovy @@ -205,6 +205,8 @@ def setBucketKey() { atomicState.bucketName = "$newBucketName" atomicState.isBucketCreated = false } + + tryCreateBucket() } def setAccessKey() { @@ -255,7 +257,12 @@ def uninstalled() { log.debug "uninstalled (version $atomicState.version)" } -def createBucket() { +def tryCreateBucket() { + + // if the bucket has already been created, no need to continue + if (atomicState.isBucketCreated) { + return + } if (!atomicState.bucketName) { atomicState.bucketName = atomicState.bucketKey @@ -305,13 +312,7 @@ def genericHandler(evt) { } def value = "$evt.value" - if (atomicState.accessKey == null || atomicState.bucketKey == null) { - return - } - - if (!atomicState.isBucketCreated) { - createBucket() - } + tryCreateBucket() eventHandler(key, value) } @@ -321,7 +322,7 @@ def genericHandler(evt) { def flushBuffer() { log.trace "About to flush the buffer on schedule" if (atomicState.eventBuffer != null && atomicState.eventBuffer.size() > 0) { - shipEvents() + tryShipEvents() } } @@ -337,12 +338,18 @@ def eventHandler(name, value) { atomicState.eventBuffer = eventBuffer if (eventBuffer.size() >= 10) { - shipEvents() + tryShipEvents() } } // a helper function for shipping the atomicState.eventBuffer to Initial State -def shipEvents() { +def tryShipEvents() { + + // can't ship if access key and bucket key are null, so finish trying + if (atomicState.accessKey == null || atomicState.bucketKey == null) { + return + } + def eventPost = [ uri: "https://${atomicState.grokerSubdomain}.initialstate.com/api/events", headers: [ From 1c2189b63c5fcb7a1f99d7b1a428ca5715fb0420 Mon Sep 17 00:00:00 2001 From: David Sulpy Date: Mon, 14 Sep 2015 16:33:48 -0500 Subject: [PATCH 4/4] bumped the version --- .../initial-state-event-streamer.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smartapps/initialstate-events/initial-state-event-streamer.src/initial-state-event-streamer.groovy b/smartapps/initialstate-events/initial-state-event-streamer.src/initial-state-event-streamer.groovy index d1ccf79..b4cf20b 100644 --- a/smartapps/initialstate-events/initial-state-event-streamer.src/initial-state-event-streamer.groovy +++ b/smartapps/initialstate-events/initial-state-event-streamer.src/initial-state-event-streamer.groovy @@ -226,7 +226,7 @@ def setAccessKey() { } def installed() { - atomicState.version = "1.0.17" + atomicState.version = "1.0.18" subscribeToEvents() atomicState.isBucketCreated = false