Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
a11bc7f
Clean slate.
Dec 12, 2018
d8b1ee2
Skeleton structure, no imp yet.
Dec 14, 2018
c3a1e0e
Rename ‘name’ to ‘type’.
Dec 17, 2018
a4002ef
Create group: simple case complete.
Dec 21, 2018
e15a34a
Factor out State to its own module.
Jan 3, 2019
8a86c5e
Travis does flakes and coverage.
Jan 3, 2019
dd1fb42
Cache to Travis.
Jan 3, 2019
c41f6dd
Fix test bugs.
Jan 3, 2019
5cb57cd
State nested keys, part 1, update.
Jan 3, 2019
4dfa592
Implement “version” command.
Jan 4, 2019
be320c2
State nested keys, part 2, get.
Jan 4, 2019
6bc72ed
Merge pull request #19 from dzimine/DZ/nested_keys
Jan 9, 2019
78692ae
Create Subscriptions
Jan 10, 2019
ec2e133
Troubles with travis
Jan 10, 2019
961cacd
Troubles with travis
Jan 10, 2019
c50c7e3
Refactor unit tests to use Session across tests.
Jan 28, 2019
a25e38d
Subscriptions.remove
Jan 28, 2019
6435be9
Merge pull request #20 from dzimine/DZ/subscriptions
Jan 28, 2019
295f119
Create Lambdas, take 1.
Jan 31, 2019
9fba5a3
Lambdas remove worked once.
Feb 1, 2019
ec4902e
Add remove-lambda to CLI
Feb 2, 2019
d490b46
Implement greengo-remove
Feb 13, 2019
f72f3e5
Improve subscription coverage
Feb 13, 2019
924b791
Add subscription test.
Feb 14, 2019
1a1b8be
Add “deploy” command.
Feb 14, 2019
cdd85c5
Merge pull request #23 from dzimine/DZ/lambdas
Feb 14, 2019
b7488c1
Make pytest work for python3
Apr 9, 2019
d05dc15
Help Travis find python3
Apr 9, 2019
63983a2
Deal with yaml.load warning.
Apr 9, 2019
4445545
Merge pull request #26 from dzimine/DZ/test_python3
Apr 9, 2019
c28ade0
Support Resources (draft)
Apr 10, 2019
6c9c2bb
Make individual entities manage their state.
Apr 10, 2019
31cd750
State.remove must support nested keys.
Apr 10, 2019
2c54a7e
Refactor Lambdas to live under one entity.
Apr 15, 2019
d2a3269
Catch a shameful bug.
Apr 15, 2019
0fd20e9
Fortify remove-lambdas.
Apr 15, 2019
78d6ef3
Implement Loggers
dzimine Apr 23, 2019
b2bd0d5
Implement update-lambda.
dzimine Apr 23, 2019
51a096e
Merge pull request #28 from dzimine/DZ/ML-inference-support
Apr 23, 2019
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
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
!.gitignore
!.travis
.*
certs/**
config/**
Expand All @@ -7,4 +8,5 @@ venv
*.pyc
__pycache__/**
/*.egg-info
/dist/
/dist/
htmlcov
6 changes: 5 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
dist: xenial
language: python
python:
- "2.7"
- "3.7"
# cache: pip

# command to install dependencies
install:
- pip install -r requirements.txt
# command to run tests
script:
- pytest # or py.test for Python versions 3.5 and below
- pytest --flakes --cov=greengo tests/
12 changes: 10 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -143,15 +143,23 @@ Clone the project, set up your environment, install dependencies and setup `gree
```
$ git clone https://github.com/dzimine/greengo.git
$ cd greengo
$ virtualenv venv

# For python2:
$ virtualenv venv
$ . venv/bin/activate

# For python3
$ python3 -m venv .venv3
$ . .venv3/bin/activate

$ pip install -r requirements.txt

# Install greengo into the virtualenv
$ pip install -e .
```

Run the unit tests:

```
pytest -s
pytest -s tests/
```
1 change: 1 addition & 0 deletions greengo.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ Cores:

Lambdas:
- name: GreengrassHelloWorld
runtime: python2.7
handler: function.handler
package: lambdas/GreengrassHelloWorld
alias: dev
Expand Down
2 changes: 1 addition & 1 deletion greengo/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = '1.0.6'
__version__ = '2.0.0'
120 changes: 120 additions & 0 deletions greengo/entity.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
import logging

from .utils import pretty

log = logging.getLogger(__name__)


# Alternative names: Definition
class Entity(object):
''' The base class for Greengrass model elements '''

_session = None

def __init__(self, group, state):
self.type = "REPLACE WITH CHILD CLASS TYPE!"
self._state = state
self._group = group

# Objects dependent on this, (immediate children),
# thus must be removed prior to `this` object is removed.
self._dependants = set()

# Object types that must be created prior to this object's creation
# Note that it's list of Types (classes), not instances.
self._requirements = []

def add_dependant(self, entity):
self._dependants.add(entity)

def create(self, update_group_version=True):
if self._pre_create():
self._do_create()
self._post_create(update_group_version)

def _pre_create(self):
log.info("Creating {}...".format(self.type.lower()))

if not self._group.get(self.type):
log.warning("{} not defined, skipping.".format(self.type))
return False

if self._state.get(self.type):
log.warning("{} already created. Remove before creating again.".format(self.type))
return False

# Check if requred objects alrady created, if not - warn and exit.
missed = [r for r in self._requirements if r not in self._state.entities()]
if missed:
log.warning("{} must be created before {}. Please create first.".format(
', '.join(missed), self.type))
return False

return True

def _do_create(self):
raise NotImplementedError

def _post_create(self, update_group_version):
if update_group_version:
log.info("Updating group version with new {}...".format(self.type))
self.create_group_version(self._state)

log.info("{} created OK!".format(self.type))

def remove(self, update_group_version=True):
if self._pre_remove():
self._do_remove()
self._post_remove(update_group_version)

def _pre_remove(self):
log.info("Removing {}".format(self.type.lower()))

if not self._state.get(self.type):
log.warning("{} does not exist, skipping remove.".format(self.type))
return False

return True

def _do_remove(self):
raise NotImplementedError

def _post_remove(self, update_group_version):
if update_group_version:
log.info("Updating group version with {} removed...".format(self.type))
self.create_group_version(self._state)

self._state.remove(self.type)
log.info("{} removed OK!".format(self.type.lower()))

@classmethod
def create_group_version(klass, state):
if not state.get('Group.Id'):
log.debug("Attempting to update group version but the group doesn't exist, skipping!")
return

# Compile a list of non-empty arguments from the super-set,
# https://docs.aws.amazon.com/greengrass/latest/apireference/definitions-groupversion.html
kwargs = dict(
GroupId=state.get('Group')['Id'], # REQUIRED
CoreDefinitionVersionArn=state.get(
'CoreDefinition.LatestVersionArn', ""),
FunctionDefinitionVersionArn=state.get(
'Lambdas.FunctionDefinition.LatestVersionArn', ""),
SubscriptionDefinitionVersionArn=state.get(
'Subscriptions.LatestVersionArn', ""),
LoggerDefinitionVersionArn=state.get(
'Loggers.LatestVersionArn', ""),
ResourceDefinitionVersionArn=state.get(
'Resources.LatestVersionArn', ""),
ConnectorDefinitionVersionArn=state.get(
'Connectors.LatestVersionArn', ""),
DeviceDefinitionVersionArn="" # NOT IMPLEMENTED
)
args = dict((k, v) for k, v in kwargs.items() if v)
log.debug("Creating group version with settings:\n{0}".format(pretty(args)))

_gg = Entity._session.client("greengrass")
group_ver = _gg.create_group_version(**args)

state.update('Group.Version', group_ver)
Loading