Default solana-test-validator --bpf-programs to upgradeable loader (#30485)

* Dedupe parsing

* Update --bpf-program param to use upgradeable loader, upgrade authority disabled

* Update add_program to use upgreadeable loader

* Deprecate non-upgradeable utils
This commit is contained in:
Tyera 2023-02-24 09:22:27 -07:00 committed by GitHub
parent 5da9e52e1c
commit 08ca9cc17d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 43 additions and 40 deletions

View File

@ -69,6 +69,7 @@ pub struct AccountInfo<'a> {
pub filename: &'a str,
}
#[deprecated(since = "1.16.0", note = "Please use `UpgradeableProgramInfo` instead")]
#[derive(Clone)]
pub struct ProgramInfo {
pub program_id: Pubkey,
@ -118,6 +119,7 @@ pub struct TestValidatorGenesis {
warp_slot: Option<Slot>,
no_bpf_jit: bool,
accounts: HashMap<Pubkey, AccountSharedData>,
#[allow(deprecated)]
programs: Vec<ProgramInfo>,
upgradeable_programs: Vec<UpgradeableProgramInfo>,
ticks_per_slot: Option<u64>,
@ -150,6 +152,7 @@ impl Default for TestValidatorGenesis {
warp_slot: Option::<Slot>::default(),
no_bpf_jit: bool::default(),
accounts: HashMap::<Pubkey, AccountSharedData>::default(),
#[allow(deprecated)]
programs: Vec::<ProgramInfo>::default(),
upgradeable_programs: Vec::<UpgradeableProgramInfo>::default(),
ticks_per_slot: Option::<u64>::default(),
@ -482,15 +485,21 @@ impl TestValidatorGenesis {
let program_path = solana_program_test::find_file(&format!("{program_name}.so"))
.unwrap_or_else(|| panic!("Unable to locate program {program_name}"));
self.programs.push(ProgramInfo {
self.upgradeable_programs.push(UpgradeableProgramInfo {
program_id,
loader: solana_sdk::bpf_loader::id(),
loader: solana_sdk::bpf_loader_upgradeable::id(),
upgrade_authority: Pubkey::default(),
program_path,
});
self
}
/// Add a list of programs to the test environment.
#[deprecated(
since = "1.16.0",
note = "Please use `add_upgradeable_programs_with_path()` instead"
)]
#[allow(deprecated)]
pub fn add_programs_with_path(&mut self, programs: &[ProgramInfo]) -> &mut Self {
for program in programs {
self.programs.push(program.clone());
@ -680,6 +689,7 @@ impl TestValidator {
for (address, account) in solana_program_test::programs::spl_programs(&config.rent) {
accounts.entry(address).or_insert(account);
}
#[allow(deprecated)]
for program in &config.programs {
let data = solana_program_test::read_file(&program.program_path);
accounts.insert(

View File

@ -179,32 +179,41 @@ fn main() {
let faucet_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::UNSPECIFIED), faucet_port);
let mut programs_to_load = vec![];
let parse_address = |address: &str, input_type: &str| {
address
.parse::<Pubkey>()
.or_else(|_| read_keypair_file(address).map(|keypair| keypair.pubkey()))
.unwrap_or_else(|err| {
println!("Error: invalid {input_type} {address}: {err}");
exit(1);
})
};
let parse_program_path = |program: &str| {
let program_path = PathBuf::from(program);
if !program_path.exists() {
println!(
"Error: program file does not exist: {}",
program_path.display()
);
exit(1);
}
program_path
};
let mut upgradeable_programs_to_load = vec![];
if let Some(values) = matches.values_of("bpf_program") {
let values: Vec<&str> = values.collect::<Vec<_>>();
for address_program in values.chunks(2) {
match address_program {
[address, program] => {
let address = address
.parse::<Pubkey>()
.or_else(|_| read_keypair_file(address).map(|keypair| keypair.pubkey()))
.unwrap_or_else(|err| {
println!("Error: invalid address {address}: {err}");
exit(1);
});
let address = parse_address(address, "address");
let program_path = parse_program_path(program);
let program_path = PathBuf::from(program);
if !program_path.exists() {
println!(
"Error: program file does not exist: {}",
program_path.display()
);
exit(1);
}
programs_to_load.push(ProgramInfo {
upgradeable_programs_to_load.push(UpgradeableProgramInfo {
program_id: address,
loader: solana_sdk::bpf_loader::id(),
loader: solana_sdk::bpf_loader_upgradeable::id(),
upgrade_authority: Pubkey::default(),
program_path,
});
}
@ -213,19 +222,13 @@ fn main() {
}
}
let mut upgradeable_programs_to_load = vec![];
if let Some(values) = matches.values_of("upgradeable_program") {
let values: Vec<&str> = values.collect::<Vec<_>>();
for address_program_upgrade_authority in values.chunks(3) {
match address_program_upgrade_authority {
[address, program, upgrade_authority] => {
let address = address
.parse::<Pubkey>()
.or_else(|_| read_keypair_file(address).map(|keypair| keypair.pubkey()))
.unwrap_or_else(|err| {
println!("Error: invalid address {address}: {err}");
exit(1);
});
let address = parse_address(address, "address");
let program_path = parse_program_path(program);
let upgrade_authority_address = if *upgrade_authority == "none" {
Pubkey::default()
} else {
@ -242,15 +245,6 @@ fn main() {
})
};
let program_path = PathBuf::from(program);
if !program_path.exists() {
println!(
"Error: program file does not exist: {}",
program_path.display()
);
exit(1);
}
upgradeable_programs_to_load.push(UpgradeableProgramInfo {
program_id: address,
loader: solana_sdk::bpf_loader_upgradeable::id(),
@ -458,7 +452,6 @@ fn main() {
})
.bpf_jit(!matches.is_present("no_bpf_jit"))
.rpc_port(rpc_port)
.add_programs_with_path(&programs_to_load)
.add_upgradeable_programs_with_path(&upgradeable_programs_to_load)
.add_accounts_from_json_files(&accounts_to_load)
.unwrap_or_else(|e| {

View File

@ -2016,7 +2016,7 @@ pub fn test_app<'a>(version: &'a str, default_args: &'a DefaultTestArgs) -> App<
.number_of_values(2)
.multiple(true)
.help(
"Add a SBF program to the genesis configuration. \
"Add a SBF program to the genesis configuration with upgrades disabled. \
If the ledger already exists then this parameter is silently ignored. \
First argument can be a pubkey string or path to a keypair",
),