diff --git a/lemur/certificates/models.py b/lemur/certificates/models.py index f5a7d9ca..956e5a4f 100644 --- a/lemur/certificates/models.py +++ b/lemur/certificates/models.py @@ -41,7 +41,7 @@ class Certificate(db.Model): owner = Column(String(128), nullable=False) name = Column(String(128), unique=True) description = Column(String(1024)) - active = Column(Boolean, default=True) + notify = Column(Boolean, default=True) body = Column(Text(), nullable=False) chain = Column(Text()) @@ -114,6 +114,11 @@ class Certificate(db.Model): for domain in defaults.domains(cert): self.domains.append(Domain(name=domain)) + @property + def active(self): + if self.endpoints: + return True + @hybrid_property def expired(self): if self.not_after <= datetime.datetime.now(): @@ -195,5 +200,7 @@ def protect_active(mapper, connection, target): :return: """ if target.active: - if target.replaced: - raise Exception("Cannot mark certificate as active, certificate has been marked as replaced.") + if not target.notify: + raise Exception( + "Cannot silence notification for a certificate Lemur has been found to be currently deployed onto endpoints" + ) diff --git a/lemur/certificates/schemas.py b/lemur/certificates/schemas.py index 5c2f493c..4abaf6b8 100644 --- a/lemur/certificates/schemas.py +++ b/lemur/certificates/schemas.py @@ -76,7 +76,7 @@ class CertificateInputSchema(CertificateCreationSchema): class CertificateEditInputSchema(CertificateSchema): - active = fields.Boolean() + notify = fields.Boolean() destinations = fields.Nested(AssociatedDestinationSchema, missing=[], many=True) notifications = fields.Nested(AssociatedNotificationSchema, missing=[], many=True) replacements = fields.Nested(AssociatedCertificateSchema, missing=[], many=True) @@ -104,6 +104,7 @@ class CertificateNestedOutputSchema(LemurOutputSchema): class CertificateOutputSchema(LemurOutputSchema): id = fields.Integer() active = fields.Boolean() + notify = fields.Boolean() bits = fields.Integer() body = fields.String() chain = fields.String() @@ -131,7 +132,7 @@ class CertificateOutputSchema(LemurOutputSchema): class CertificateUploadInputSchema(CertificateCreationSchema): name = fields.String() - active = fields.Boolean(missing=True) + notify = fields.Boolean(missing=True) private_key = fields.String(validate=validators.private_key) body = fields.String(required=True, validate=validators.public_certificate) diff --git a/lemur/certificates/service.py b/lemur/certificates/service.py index a81aa902..7fa9b05c 100644 --- a/lemur/certificates/service.py +++ b/lemur/certificates/service.py @@ -270,7 +270,7 @@ def render(args): elif 'destination' in terms: query = query.filter(Certificate.destinations.any(Destination.id == terms[1])) - elif 'active' in filt: # this is really weird but strcmp seems to not work here?? + elif 'active' in filt: query = query.filter(Certificate.active == terms[1]) elif 'cn' in terms: query = query.filter( diff --git a/lemur/migrations/versions/932525b82f1a_.py b/lemur/migrations/versions/932525b82f1a_.py new file mode 100644 index 00000000..9bab2634 --- /dev/null +++ b/lemur/migrations/versions/932525b82f1a_.py @@ -0,0 +1,21 @@ +"""empty message + +Revision ID: 932525b82f1a +Revises: 7f71c0cea31a +Create Date: 2016-10-13 20:14:33.928029 + +""" + +# revision identifiers, used by Alembic. +revision = '932525b82f1a' +down_revision = '7f71c0cea31a' + +from alembic import op + + +def upgrade(): + op.alter_column('certificates', 'active', new_column_name='notify') + + +def downgrade(): + op.alter_column('certificates', 'notify', new_column_name='active') diff --git a/lemur/notifications/service.py b/lemur/notifications/service.py index 0b2d353a..9fbbab86 100644 --- a/lemur/notifications/service.py +++ b/lemur/notifications/service.py @@ -160,8 +160,7 @@ def _is_eligible_for_notifications(cert): :param cert: :return: """ - # inactive certificates are not notified. - if not cert.active: + if not cert.notify: return now = arrow.utcnow() diff --git a/lemur/static/app/angular/certificates/services.js b/lemur/static/app/angular/certificates/services.js index c745db3d..2a7e0d27 100644 --- a/lemur/static/app/angular/certificates/services.js +++ b/lemur/static/app/angular/certificates/services.js @@ -189,7 +189,7 @@ angular.module('lemur') return certificate.customGET('key'); }; - CertificateService.updateActive = function (certificate) { + CertificateService.updateNotify = function (certificate) { return certificate.put(); }; diff --git a/lemur/static/app/angular/certificates/view/view.js b/lemur/static/app/angular/certificates/view/view.js index e4877d97..f18138a9 100644 --- a/lemur/static/app/angular/certificates/view/view.js +++ b/lemur/static/app/angular/certificates/view/view.js @@ -77,8 +77,8 @@ angular.module('lemur') }); }; - $scope.updateActive = function (certificate) { - CertificateService.updateActive(certificate).then( + $scope.updateNotify = function (certificate) { + CertificateService.updateNotify(certificate).then( function () { toaster.pop({ type: 'success', diff --git a/lemur/static/app/angular/certificates/view/view.tpl.html b/lemur/static/app/angular/certificates/view/view.tpl.html index 5d9174e6..8100e1f3 100644 --- a/lemur/static/app/angular/certificates/view/view.tpl.html +++ b/lemur/static/app/angular/certificates/view/view.tpl.html @@ -30,10 +30,10 @@
  • {{ certificate.owner }}
  • - +
    - +