github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/db/migration/migrations/1537546150_global_resource_version_history.down.go (about)

     1  package migrations
     2  
     3  import (
     4  	"database/sql"
     5  	"encoding/json"
     6  )
     7  
     8  type ResourceConfig struct {
     9  	Name         string   `json:"name"`
    10  	Public       bool     `json:"public,omitempty"`
    11  	WebhookToken string   `json:"webhook_token,omitempty"`
    12  	Type         string   `json:"type"`
    13  	Source       Source   `json:"source"`
    14  	CheckEvery   string   `json:"check_every,omitempty"`
    15  	CheckTimeout string   `json:"check_timeout,omitempty"`
    16  	Tags         []string `json:"tags,omitempty"`
    17  	Version      Version  `json:"version,omitempty"`
    18  }
    19  
    20  type Source map[string]interface{}
    21  
    22  type Params map[string]interface{}
    23  
    24  type Version map[string]string
    25  
    26  func (self *migrations) Down_1537546150() error {
    27  	tx, err := self.DB.Begin()
    28  	if err != nil {
    29  		return err
    30  	}
    31  
    32  	rows, err := tx.Query(`SELECT id, config, nonce FROM resources`)
    33  	if err != nil {
    34  		return err
    35  	}
    36  
    37  	type resource struct {
    38  		id    int
    39  		type_ string
    40  	}
    41  
    42  	resources := []resource{}
    43  	for rows.Next() {
    44  		var (
    45  			configBlob string
    46  			nonce      sql.NullString
    47  		)
    48  
    49  		r := resource{}
    50  		if err = rows.Scan(&r.id, &configBlob, &nonce); err != nil {
    51  			return err
    52  		}
    53  
    54  		var noncense *string
    55  		if nonce.Valid {
    56  			noncense = &nonce.String
    57  		}
    58  
    59  		decryptedConfig, err := self.Decrypt(string(configBlob), noncense)
    60  		if err != nil {
    61  			return err
    62  		}
    63  
    64  		var config ResourceConfig
    65  		err = json.Unmarshal(decryptedConfig, &config)
    66  		if err != nil {
    67  			return err
    68  		}
    69  
    70  		r.type_ = config.Type
    71  
    72  		resources = append(resources, r)
    73  	}
    74  
    75  	for _, r := range resources {
    76  		_, err = tx.Exec(`INSERT INTO versioned_resources (version, metadata, type, resource_id, check_order, enabled)
    77  	 SELECT rcv.version, rcv.metadata, $2, r.id, rcv.check_order,
    78  		NOT EXISTS ( SELECT 1 FROM resource_disabled_versions d WHERE d.version_md5 = rcv.version_md5 AND d.resource_id = r.id )
    79  	 FROM resource_config_versions rcv, resources r
    80  	 WHERE r.resource_config_id = rcv.resource_config_id AND r.id = $1
    81  	 ON CONFLICT (resource_id, md5(version), type) DO UPDATE SET
    82  		metadata = EXCLUDED.metadata,
    83  		check_order = EXCLUDED.check_order,
    84  		enabled = EXCLUDED.enabled
    85  	 `, r.id, r.type_)
    86  		if err != nil {
    87  			tx.Rollback()
    88  			return err
    89  		}
    90  	}
    91  
    92  	_, err = tx.Exec(`ALTER TABLE resources
    93      ADD COLUMN last_checked timestamp with time zone,
    94  		DROP CONSTRAINT resources_resource_config_id_fkey,
    95      ADD CONSTRAINT resources_resource_config_id_fkey FOREIGN KEY (resource_config_id) REFERENCES resource_configs(id) ON DELETE SET NULL`)
    96  	if err != nil {
    97  		tx.Rollback()
    98  		return err
    99  	}
   100  
   101  	_, err = tx.Exec(`ALTER TABLE resource_types
   102      ADD COLUMN last_checked timestamp with time zone DEFAULT '1970-01-01 00:00:00' NOT NULL,
   103  		ADD COLUMN version text`)
   104  	if err != nil {
   105  		tx.Rollback()
   106  		return err
   107  	}
   108  
   109  	_, err = tx.Exec(`ALTER TABLE resource_configs DROP COLUMN last_checked,
   110  		DROP COLUMN check_error`)
   111  	if err != nil {
   112  		tx.Rollback()
   113  		return err
   114  	}
   115  
   116  	_, err = tx.Exec(`ALTER TABLE resource_types DROP COLUMN check_error`)
   117  	if err != nil {
   118  		tx.Rollback()
   119  		return err
   120  	}
   121  
   122  	_, err = tx.Exec(`DROP TABLE build_resource_config_version_inputs`)
   123  	if err != nil {
   124  		tx.Rollback()
   125  		return err
   126  	}
   127  
   128  	_, err = tx.Exec(`DROP TABLE build_resource_config_version_outputs`)
   129  	if err != nil {
   130  		tx.Rollback()
   131  		return err
   132  	}
   133  
   134  	_, err = tx.Exec(`TRUNCATE TABLE next_build_inputs`)
   135  	if err != nil {
   136  		tx.Rollback()
   137  		return err
   138  	}
   139  
   140  	_, err = tx.Exec(`ALTER TABLE next_build_inputs DROP COLUMN resource_config_version_id,
   141  		DROP COLUMN resource_id,
   142  		ADD COLUMN version_id integer NOT NULL`)
   143  	if err != nil {
   144  		tx.Rollback()
   145  		return err
   146  	}
   147  
   148  	_, err = tx.Exec(`CREATE INDEX next_build_inputs_version_id ON next_build_inputs USING btree (version_id)`)
   149  	if err != nil {
   150  		tx.Rollback()
   151  		return err
   152  	}
   153  
   154  	_, err = tx.Exec(`ALTER TABLE ONLY next_build_inputs
   155        ADD CONSTRAINT next_build_inputs_version_id_fkey FOREIGN KEY (version_id) REFERENCES versioned_resources(id) ON DELETE CASCADE`)
   156  	if err != nil {
   157  		tx.Rollback()
   158  		return err
   159  	}
   160  
   161  	_, err = tx.Exec(`TRUNCATE TABLE independent_build_inputs`)
   162  	if err != nil {
   163  		tx.Rollback()
   164  		return err
   165  	}
   166  
   167  	_, err = tx.Exec(`ALTER TABLE independent_build_inputs DROP COLUMN resource_config_version_id, DROP COLUMN resource_id, ADD COLUMN version_id integer NOT NULL`)
   168  	if err != nil {
   169  		tx.Rollback()
   170  		return err
   171  	}
   172  
   173  	_, err = tx.Exec(`CREATE INDEX independent_build_inputs_version_id ON independent_build_inputs USING btree (version_id)`)
   174  	if err != nil {
   175  		tx.Rollback()
   176  		return err
   177  	}
   178  
   179  	_, err = tx.Exec(`ALTER TABLE ONLY independent_build_inputs
   180        ADD CONSTRAINT independent_build_inputs_version_id_fkey FOREIGN KEY (version_id) REFERENCES versioned_resources(id) ON DELETE CASCADE`)
   181  	if err != nil {
   182  		tx.Rollback()
   183  		return err
   184  	}
   185  
   186  	_, err = tx.Exec(`DROP TABLE resource_config_versions`)
   187  	if err != nil {
   188  		tx.Rollback()
   189  		return err
   190  	}
   191  
   192  	_, err = tx.Exec(`DROP TABLE resource_disabled_versions`)
   193  	if err != nil {
   194  		tx.Rollback()
   195  		return err
   196  	}
   197  
   198  	_, err = tx.Exec(`DROP INDEX resource_caches_resource_config_id_version_params_hash_uniq`)
   199  	if err != nil {
   200  		tx.Rollback()
   201  		return err
   202  	}
   203  
   204  	_, err = tx.Exec(`ALTER TABLE resource_caches ALTER COLUMN version TYPE text USING version::text`)
   205  	if err != nil {
   206  		tx.Rollback()
   207  		return err
   208  	}
   209  
   210  	_, err = tx.Exec(`CREATE UNIQUE INDEX resource_caches_resource_config_id_version_params_hash_key ON resource_caches (resource_config_id, md5(version), params_hash)`)
   211  	if err != nil {
   212  		tx.Rollback()
   213  		return err
   214  	}
   215  
   216  	_, err = tx.Exec(`ALTER TABLE worker_resource_config_check_sessions ADD COLUMN team_id integer`)
   217  	if err != nil {
   218  		tx.Rollback()
   219  		return err
   220  	}
   221  
   222  	_, err = tx.Exec(`ALTER TABLE ONLY worker_resource_config_check_sessions
   223      ADD CONSTRAINT worker_resource_config_check_sessions_team_id_fkey FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE`)
   224  	if err != nil {
   225  		tx.Rollback()
   226  		return err
   227  	}
   228  
   229  	_, err = tx.Exec(`DROP INDEX worker_resource_config_check_sessions_uniq`)
   230  	if err != nil {
   231  		tx.Rollback()
   232  		return err
   233  	}
   234  
   235  	_, err = tx.Exec(`CREATE UNIQUE INDEX worker_resource_config_check_sessions_uniq
   236    ON worker_resource_config_check_sessions (resource_config_check_session_id, worker_base_resource_type_id, team_id)`)
   237  	if err != nil {
   238  		tx.Rollback()
   239  		return err
   240  	}
   241  
   242  	err = tx.Commit()
   243  	if err != nil {
   244  		tx.Rollback()
   245  		return err
   246  	}
   247  
   248  	return nil
   249  }