From b901c4c0d3d24d3e5cccb6f91a343b8b71d8b4c0 Mon Sep 17 00:00:00 2001 From: Zachary Wasserman Date: Thu, 1 Dec 2016 13:21:27 -0800 Subject: [PATCH] Update models/service method for saving queries (#553) - Add saved state to query (to differentiate queries explicitly saved from those just run as distributed queries) - Remove unique constraint on query name Closes #390 --- .../20161118212649_CreateTableQueries.go | 4 ++-- server/kolide/queries.go | 17 +++++++++-------- server/service/service_campaigns.go | 16 +++++++++------- server/service/service_queries.go | 2 +- 4 files changed, 21 insertions(+), 18 deletions(-) diff --git a/server/datastore/mysql/migrations/20161118212649_CreateTableQueries.go b/server/datastore/mysql/migrations/20161118212649_CreateTableQueries.go index 6d8f261869..9f857f8ad9 100644 --- a/server/datastore/mysql/migrations/20161118212649_CreateTableQueries.go +++ b/server/datastore/mysql/migrations/20161118212649_CreateTableQueries.go @@ -18,6 +18,7 @@ func Up_20161118212649(tx *sql.Tx) error { "`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," + "`deleted_at` timestamp NULL DEFAULT NULL," + "`deleted` tinyint(1) NOT NULL DEFAULT FALSE," + + "`saved` tinyint(1) NOT NULL DEFAULT FALSE," + "`name` varchar(255) NOT NULL," + "`description` varchar(255) DEFAULT NULL," + "`query` varchar(255) NOT NULL," + @@ -26,8 +27,7 @@ func Up_20161118212649(tx *sql.Tx) error { "`differential` tinyint(1) NOT NULL DEFAULT FALSE," + "`platform` varchar(255) DEFAULT NULL," + "`version` varchar(255) DEFAULT NULL," + - "PRIMARY KEY (`id`)," + - "UNIQUE KEY `idx_query_unique_name` (`name`)" + + "PRIMARY KEY (`id`)" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8;", ) return err diff --git a/server/kolide/queries.go b/server/kolide/queries.go index d6235a3099..c852dcc8e7 100644 --- a/server/kolide/queries.go +++ b/server/kolide/queries.go @@ -24,20 +24,21 @@ type QueryService interface { } type QueryPayload struct { - Name *string - Description *string - Query *string - Interval *uint - Snapshot *bool - Differential *bool - Platform *string - Version *string + Name *string `json:"name"` + Description *string `json:"description"` + Query *string `json:"query"` + Interval *uint `json:"interval"` + Snapshot *bool `json:"snapshot"` + Differential *bool `json:"differential"` + Platform *string `json:"platform"` + Version *string `json:"version"` } type Query struct { UpdateCreateTimestamps DeleteFields ID uint `json:"id"` + Saved bool `json:"saved"` Name string `json:"name"` Description string `json:"description"` Query string `json:"query"` diff --git a/server/service/service_campaigns.go b/server/service/service_campaigns.go index 304a7d42ac..0bf5ce9749 100644 --- a/server/service/service_campaigns.go +++ b/server/service/service_campaigns.go @@ -7,6 +7,7 @@ import ( "github.com/kolide/kolide-ose/server/contexts/viewer" "github.com/kolide/kolide-ose/server/kolide" "github.com/kolide/kolide-ose/server/websocket" + "github.com/pkg/errors" "golang.org/x/net/context" ) @@ -16,12 +17,13 @@ func (svc service) NewDistributedQueryCampaign(ctx context.Context, queryString return nil, errNoContext } - query, err := svc.NewQuery(ctx, kolide.QueryPayload{ - Name: &queryString, - Query: &queryString, + query, err := svc.ds.NewQuery(&kolide.Query{ + Name: fmt.Sprintf("distributed_%s_%d", vc.Username(), time.Now().Unix()), + Query: queryString, + Saved: false, }) if err != nil { - return nil, err + return nil, errors.Wrap(err, "new query") } campaign, err := svc.ds.NewDistributedQueryCampaign(&kolide.DistributedQueryCampaign{ @@ -30,7 +32,7 @@ func (svc service) NewDistributedQueryCampaign(ctx context.Context, queryString UserID: vc.UserID(), }) if err != nil { - return nil, err + return nil, errors.Wrap(err, "new campaign") } // Add host targets @@ -41,7 +43,7 @@ func (svc service) NewDistributedQueryCampaign(ctx context.Context, queryString TargetID: hid, }) if err != nil { - return nil, err + return nil, errors.Wrap(err, "adding host target") } } @@ -53,7 +55,7 @@ func (svc service) NewDistributedQueryCampaign(ctx context.Context, queryString TargetID: lid, }) if err != nil { - return nil, err + return nil, errors.Wrap(err, "adding label target") } } diff --git a/server/service/service_queries.go b/server/service/service_queries.go index 46be376078..496bcde3ab 100644 --- a/server/service/service_queries.go +++ b/server/service/service_queries.go @@ -14,7 +14,7 @@ func (svc service) GetQuery(ctx context.Context, id uint) (*kolide.Query, error) } func (svc service) NewQuery(ctx context.Context, p kolide.QueryPayload) (*kolide.Query, error) { - query := &kolide.Query{} + query := &kolide.Query{Saved: true} if p.Name != nil { query.Name = *p.Name