diff --git a/src/confd/src/dagger.c b/src/confd/src/dagger.c index a8aea6f5..554354a6 100644 --- a/src/confd/src/dagger.c +++ b/src/confd/src/dagger.c @@ -124,8 +124,12 @@ int dagger_abandon(struct dagger *d) { int exitcode; + if (!d->next_fp) + return 0; + fprintf(d->next_fp, "%d\n", d->next); fclose(d->next_fp); + d->next_fp = NULL; exitcode = systemf("dagger -C %s abandon", d->path); DEBUG("dagger(%d->%d): abandon: exitcode=%d\n", @@ -134,12 +138,13 @@ int dagger_abandon(struct dagger *d) return exitcode; } -int dagger_evolve(struct dagger *d) +static int dagger_evolve(struct dagger *d) { int exitcode; fprintf(d->next_fp, "%d\n", d->next); fclose(d->next_fp); + d->next_fp = NULL; exitcode = systemf("dagger -C %s evolve", d->path); DEBUG("dagger(%d->%d): evolve: exitcode=%d\n", @@ -163,6 +168,9 @@ int dagger_evolve_or_abandon(struct dagger *d) { int exitcode, err; + if (!d->next_fp) + return 0; + exitcode = dagger_evolve(d); dagger_prune(d); if (!exitcode) diff --git a/src/confd/src/dagger.h b/src/confd/src/dagger.h index c08217e2..bf305c6a 100644 --- a/src/confd/src/dagger.h +++ b/src/confd/src/dagger.h @@ -24,7 +24,6 @@ FILE *dagger_fopen_current(struct dagger *d, const char *action, const char *nod int dagger_add_dep(const struct dagger *d, const char *depender, const char *dependee); int dagger_add_node(struct dagger *d, const char *node); int dagger_abandon(struct dagger *d); -int dagger_evolve(struct dagger *d); int dagger_evolve_or_abandon(struct dagger *d); int dagger_is_bootstrap(struct dagger *d); diff --git a/src/confd/src/interfaces.c b/src/confd/src/interfaces.c index ba1e04a0..a50879e6 100644 --- a/src/confd/src/interfaces.c +++ b/src/confd/src/interfaces.c @@ -774,7 +774,8 @@ static sr_error_t ifchange_post(sr_session_ctx_t *session, struct dagger *net, return err ? SR_ERR_INTERNAL : SR_ERR_OK; } -int interfaces_change(sr_session_ctx_t *session, struct lyd_node *config, struct lyd_node *diff, sr_event_t event, struct confd *confd) +int interfaces_change(sr_session_ctx_t *session, struct lyd_node *config, struct lyd_node *diff, + sr_event_t event, struct confd *confd) { struct lyd_node *cifs, *difs, *cif, *dif; sr_error_t err; @@ -794,12 +795,18 @@ int interfaces_change(sr_session_ctx_t *session, struct lyd_node *config, struct return SR_ERR_OK; } + difs = lydx_get_descendant(diff, "interfaces", "interface", NULL); + if (!difs) { + /* No interface changes, skip to prevent another dagger generation */ + return SR_ERR_OK; + } + err = dagger_claim(&confd->netdag, "/run/net"); if (err) return err; cifs = lydx_get_descendant(config, "interfaces", "interface", NULL); - difs = lydx_get_descendant(diff, "interfaces", "interface", NULL); + err = netdag_init(session, &confd->netdag, cifs, difs); if (err) goto err_out;