本文整理汇总了Golang中github.com/wallyworld/core/environs/testing.UploadFakeTools函数的典型用法代码示例。如果您正苦于以下问题:Golang UploadFakeTools函数的具体用法?Golang UploadFakeTools怎么用?Golang UploadFakeTools使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了UploadFakeTools函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码示例。
示例1: TestAllocateAddress
func (s *suite) TestAllocateAddress(c *gc.C) {
cfg, err := config.New(config.NoDefaults, s.TestConfig)
c.Assert(err, gc.IsNil)
e, err := environs.Prepare(cfg, testing.Context(c), s.ConfigStore)
c.Assert(err, gc.IsNil, gc.Commentf("preparing environ %#v", s.TestConfig))
c.Assert(e, gc.NotNil)
envtesting.UploadFakeTools(c, e.Storage())
err = bootstrap.EnsureNotBootstrapped(e)
c.Assert(err, gc.IsNil)
err = bootstrap.Bootstrap(testing.Context(c), e, environs.BootstrapParams{})
c.Assert(err, gc.IsNil)
inst, _ := jujutesting.AssertStartInstance(c, e, "0")
c.Assert(inst, gc.NotNil)
netId := network.Id("net1")
opc := make(chan dummy.Operation, 200)
dummy.Listen(opc)
expectAddress := instance.NewAddress("0.1.2.1", instance.NetworkCloudLocal)
address, err := e.AllocateAddress(inst.Id(), netId)
c.Assert(err, gc.IsNil)
c.Assert(address, gc.DeepEquals, expectAddress)
assertAllocateAddress(c, e, opc, inst.Id(), netId, expectAddress)
expectAddress = instance.NewAddress("0.1.2.2", instance.NetworkCloudLocal)
address, err = e.AllocateAddress(inst.Id(), netId)
c.Assert(err, gc.IsNil)
c.Assert(address, gc.DeepEquals, expectAddress)
assertAllocateAddress(c, e, opc, inst.Id(), netId, expectAddress)
}
开发者ID:jameinel,项目名称:core,代码行数:33,代码来源:environs_test.go
示例2: TestNewConn
func (*NewAPIConnSuite) TestNewConn(c *gc.C) {
cfg, err := config.New(config.NoDefaults, dummy.SampleConfig())
c.Assert(err, gc.IsNil)
ctx := coretesting.Context(c)
env, err := environs.Prepare(cfg, ctx, configstore.NewMem())
c.Assert(err, gc.IsNil)
envtesting.UploadFakeTools(c, env.Storage())
err = bootstrap.Bootstrap(ctx, env, environs.BootstrapParams{})
c.Assert(err, gc.IsNil)
cfg = env.Config()
cfg, err = cfg.Apply(map[string]interface{}{
"secret": "fnord",
})
c.Assert(err, gc.IsNil)
err = env.SetConfig(cfg)
c.Assert(err, gc.IsNil)
conn, err := juju.NewAPIConn(env, api.DefaultDialOpts())
c.Assert(err, gc.IsNil)
c.Assert(conn.Environ, gc.Equals, env)
c.Assert(conn.State, gc.NotNil)
// the secrets will not be updated, as they already exist
attrs, err := conn.State.Client().EnvironmentGet()
c.Assert(attrs["secret"], gc.Equals, "pork")
c.Assert(conn.Close(), gc.IsNil)
}
开发者ID:jameinel,项目名称:core,代码行数:30,代码来源:apiconn_test.go
示例3: TestAddresses
func (t *localServerSuite) TestAddresses(c *gc.C) {
env := t.Prepare(c)
envtesting.UploadFakeTools(c, env.Storage())
err := bootstrap.Bootstrap(coretesting.Context(c), env, environs.BootstrapParams{})
c.Assert(err, gc.IsNil)
inst, _ := testing.AssertStartInstance(c, env, "1")
c.Assert(err, gc.IsNil)
addrs, err := inst.Addresses()
c.Assert(err, gc.IsNil)
// Expected values use Address type but really contain a regexp for
// the value rather than a valid ip or hostname.
expected := []instance.Address{{
Value: "*.testing.invalid",
Type: instance.HostName,
NetworkScope: instance.NetworkPublic,
}, {
Value: "*.internal.invalid",
Type: instance.HostName,
NetworkScope: instance.NetworkCloudLocal,
}, {
Value: "8.0.0.*",
Type: instance.Ipv4Address,
NetworkScope: instance.NetworkPublic,
}, {
Value: "127.0.0.*",
Type: instance.Ipv4Address,
NetworkScope: instance.NetworkCloudLocal,
}}
c.Assert(addrs, gc.HasLen, len(expected))
for i, addr := range addrs {
c.Check(addr.Value, gc.Matches, expected[i].Value)
c.Check(addr.Type, gc.Equals, expected[i].Type)
c.Check(addr.NetworkScope, gc.Equals, expected[i].NetworkScope)
}
}
开发者ID:jameinel,项目名称:core,代码行数:35,代码来源:local_test.go
示例4: TestInstanceStatus
func (s *localServerSuite) TestInstanceStatus(c *gc.C) {
env := s.Prepare(c)
envtesting.UploadFakeTools(c, env.Storage())
inst, _ := testing.AssertStartInstance(c, env, "100")
c.Assert(inst.Status(), gc.Equals, "running")
err := env.StopInstances([]instance.Instance{inst})
c.Assert(err, gc.IsNil)
}
开发者ID:jameinel,项目名称:core,代码行数:8,代码来源:local_test.go
示例5: TestStartInstance
// If the environment is configured not to require a public IP address for nodes,
// bootstrapping and starting an instance should occur without any attempt to
// allocate a public address.
func (s *localServerSuite) TestStartInstance(c *gc.C) {
env := s.Prepare(c)
envtesting.UploadFakeTools(c, env.Storage())
err := bootstrap.Bootstrap(bootstrapContext(c), env, environs.BootstrapParams{})
c.Assert(err, gc.IsNil)
inst, _ := testing.AssertStartInstance(c, env, "100")
err = env.StopInstances([]instance.Instance{inst})
c.Assert(err, gc.IsNil)
}
开发者ID:jameinel,项目名称:core,代码行数:12,代码来源:local_test.go
示例6: testBootstrap
func (s *localJujuTestSuite) testBootstrap(c *gc.C, cfg *config.Config) (env environs.Environ) {
ctx := coretesting.Context(c)
environ, err := local.Provider.Prepare(ctx, cfg)
c.Assert(err, gc.IsNil)
envtesting.UploadFakeTools(c, environ.Storage())
defer environ.Storage().RemoveAll()
err = environ.Bootstrap(ctx, environs.BootstrapParams{})
c.Assert(err, gc.IsNil)
return environ
}
开发者ID:jameinel,项目名称:core,代码行数:10,代码来源:environ_test.go
示例7: TestStartInstanceHardwareCharacteristics
func (s *localServerSuite) TestStartInstanceHardwareCharacteristics(c *gc.C) {
env := s.Prepare(c)
envtesting.UploadFakeTools(c, env.Storage())
err := bootstrap.Bootstrap(bootstrapContext(c), env, environs.BootstrapParams{})
c.Assert(err, gc.IsNil)
_, hc := testing.AssertStartInstanceWithConstraints(c, env, "100", constraints.MustParse("mem=1024"))
c.Check(*hc.Arch, gc.Equals, "amd64")
c.Check(*hc.Mem, gc.Equals, uint64(1024))
c.Check(*hc.CpuCores, gc.Equals, uint64(1))
c.Assert(hc.CpuPower, gc.IsNil)
}
开发者ID:jameinel,项目名称:core,代码行数:11,代码来源:local_test.go
示例8: bootstrapEnv
func bootstrapEnv(c *gc.C, envName string, store configstore.Storage) {
if store == nil {
store = configstore.NewMem()
}
ctx := coretesting.Context(c)
env, err := environs.PrepareFromName(envName, ctx, store)
c.Assert(err, gc.IsNil)
envtesting.UploadFakeTools(c, env.Storage())
err = bootstrap.Bootstrap(ctx, env, environs.BootstrapParams{})
c.Assert(err, gc.IsNil)
}
开发者ID:jameinel,项目名称:core,代码行数:11,代码来源:conn_test.go
示例9: TestNewDummyEnviron
func (*OpenSuite) TestNewDummyEnviron(c *gc.C) {
// matches *Settings.Map()
cfg, err := config.New(config.NoDefaults, dummySampleConfig())
c.Assert(err, gc.IsNil)
ctx := testing.Context(c)
env, err := environs.Prepare(cfg, ctx, configstore.NewMem())
c.Assert(err, gc.IsNil)
envtesting.UploadFakeTools(c, env.Storage())
err = bootstrap.Bootstrap(ctx, env, environs.BootstrapParams{})
c.Assert(err, gc.IsNil)
}
开发者ID:jameinel,项目名称:core,代码行数:11,代码来源:open_test.go
示例10: SetUpSuite
func (t *LiveTests) SetUpSuite(c *gc.C) {
t.LoggingSuite.SetUpSuite(c)
// TODO: Share code from jujutest.LiveTests for creating environment
e, err := environs.NewFromAttrs(t.TestConfig)
c.Assert(err, gc.IsNil)
// Put some fake tools in place so that tests that are simply
// starting instances without any need to check if those instances
// are running will find them in the public bucket.
envtesting.UploadFakeTools(c, e.Storage())
t.LiveTests.SetUpSuite(c)
}
开发者ID:jameinel,项目名称:core,代码行数:12,代码来源:live_test.go
示例11: TestStartStop
// TestStartStop is similar to Tests.TestStartStop except
// that it does not assume a pristine environment.
func (t *LiveTests) TestStartStop(c *gc.C) {
t.PrepareOnce(c)
envtesting.UploadFakeTools(c, t.Env.Storage())
inst, _ := testing.AssertStartInstance(c, t.Env, "0")
c.Assert(inst, gc.NotNil)
id0 := inst.Id()
insts, err := t.Env.Instances([]instance.Id{id0, id0})
c.Assert(err, gc.IsNil)
c.Assert(insts, gc.HasLen, 2)
c.Assert(insts[0].Id(), gc.Equals, id0)
c.Assert(insts[1].Id(), gc.Equals, id0)
// Asserting on the return of AllInstances makes the test fragile,
// as even comparing the before and after start values can be thrown
// off if other instances have been created or destroyed in the same
// time frame. Instead, just check the instance we created exists.
insts, err = t.Env.AllInstances()
c.Assert(err, gc.IsNil)
found := false
for _, inst := range insts {
if inst.Id() == id0 {
c.Assert(found, gc.Equals, false, gc.Commentf("%v", insts))
found = true
}
}
c.Assert(found, gc.Equals, true, gc.Commentf("expected %v in %v", inst, insts))
dns, err := inst.WaitDNSName()
c.Assert(err, gc.IsNil)
c.Assert(dns, gc.Not(gc.Equals), "")
insts, err = t.Env.Instances([]instance.Id{id0, ""})
c.Assert(err, gc.Equals, environs.ErrPartialInstances)
c.Assert(insts, gc.HasLen, 2)
c.Check(insts[0].Id(), gc.Equals, id0)
c.Check(insts[1], gc.IsNil)
err = t.Env.StopInstances([]instance.Instance{inst})
c.Assert(err, gc.IsNil)
// The machine may not be marked as shutting down
// immediately. Repeat a few times to ensure we get the error.
for a := t.Attempt.Start(); a.Next(); {
insts, err = t.Env.Instances([]instance.Id{id0})
if err != nil {
break
}
}
c.Assert(err, gc.Equals, environs.ErrNoInstances)
c.Assert(insts, gc.HasLen, 0)
}
开发者ID:jameinel,项目名称:core,代码行数:55,代码来源:livetests.go
示例12: TestBootstrap
func (t *Tests) TestBootstrap(c *gc.C) {
e := t.Prepare(c)
envtesting.UploadFakeTools(c, e.Storage())
err := bootstrap.EnsureNotBootstrapped(e)
c.Assert(err, gc.IsNil)
err = bootstrap.Bootstrap(coretesting.Context(c), e, environs.BootstrapParams{})
c.Assert(err, gc.IsNil)
info, apiInfo, err := e.StateInfo()
c.Check(info.Addrs, gc.Not(gc.HasLen), 0)
c.Check(apiInfo.Addrs, gc.Not(gc.HasLen), 0)
err = bootstrap.EnsureNotBootstrapped(e)
c.Assert(err, gc.ErrorMatches, "environment is already bootstrapped")
e2 := t.Open(c)
envtesting.UploadFakeTools(c, e2.Storage())
err = bootstrap.EnsureNotBootstrapped(e2)
c.Assert(err, gc.ErrorMatches, "environment is already bootstrapped")
info2, apiInfo2, err := e2.StateInfo()
c.Check(info2, gc.DeepEquals, info)
c.Check(apiInfo2, gc.DeepEquals, apiInfo)
err = environs.Destroy(e2, t.ConfigStore)
c.Assert(err, gc.IsNil)
// Prepare again because Destroy invalidates old environments.
e3 := t.Prepare(c)
envtesting.UploadFakeTools(c, e3.Storage())
err = bootstrap.EnsureNotBootstrapped(e3)
c.Assert(err, gc.IsNil)
err = bootstrap.Bootstrap(coretesting.Context(c), e3, environs.BootstrapParams{})
c.Assert(err, gc.IsNil)
err = bootstrap.EnsureNotBootstrapped(e3)
c.Assert(err, gc.ErrorMatches, "environment is already bootstrapped")
}
开发者ID:jameinel,项目名称:core,代码行数:39,代码来源:tests.go
示例13: TestStartStop
func (t *Tests) TestStartStop(c *gc.C) {
e := t.Prepare(c)
envtesting.UploadFakeTools(c, e.Storage())
cfg, err := e.Config().Apply(map[string]interface{}{
"agent-version": version.Current.Number.String(),
})
c.Assert(err, gc.IsNil)
err = e.SetConfig(cfg)
c.Assert(err, gc.IsNil)
insts, err := e.Instances(nil)
c.Assert(err, gc.IsNil)
c.Assert(insts, gc.HasLen, 0)
inst0, hc := testing.AssertStartInstance(c, e, "0")
c.Assert(inst0, gc.NotNil)
id0 := inst0.Id()
// Sanity check for hardware characteristics.
c.Assert(hc.Arch, gc.NotNil)
c.Assert(hc.Mem, gc.NotNil)
c.Assert(hc.CpuCores, gc.NotNil)
inst1, _ := testing.AssertStartInstance(c, e, "1")
c.Assert(inst1, gc.NotNil)
id1 := inst1.Id()
insts, err = e.Instances([]instance.Id{id0, id1})
c.Assert(err, gc.IsNil)
c.Assert(insts, gc.HasLen, 2)
c.Assert(insts[0].Id(), gc.Equals, id0)
c.Assert(insts[1].Id(), gc.Equals, id1)
// order of results is not specified
insts, err = e.AllInstances()
c.Assert(err, gc.IsNil)
c.Assert(insts, gc.HasLen, 2)
c.Assert(insts[0].Id(), gc.Not(gc.Equals), insts[1].Id())
err = e.StopInstances([]instance.Instance{inst0})
c.Assert(err, gc.IsNil)
insts, err = e.Instances([]instance.Id{id0, id1})
c.Assert(err, gc.Equals, environs.ErrPartialInstances)
c.Assert(insts[0], gc.IsNil)
c.Assert(insts[1].Id(), gc.Equals, id1)
insts, err = e.AllInstances()
c.Assert(err, gc.IsNil)
c.Assert(insts[0].Id(), gc.Equals, id1)
}
开发者ID:jameinel,项目名称:core,代码行数:50,代码来源:tests.go
示例14: SetUpTest
func (s *ConnSuite) SetUpTest(c *gc.C) {
s.LoggingSuite.SetUpTest(c)
s.MgoSuite.SetUpTest(c)
s.ToolsFixture.SetUpTest(c)
cfg, err := config.New(config.NoDefaults, dummy.SampleConfig())
c.Assert(err, gc.IsNil)
ctx := coretesting.Context(c)
environ, err := environs.Prepare(cfg, ctx, configstore.NewMem())
c.Assert(err, gc.IsNil)
envtesting.UploadFakeTools(c, environ.Storage())
err = bootstrap.Bootstrap(ctx, environ, environs.BootstrapParams{})
c.Assert(err, gc.IsNil)
s.conn, err = juju.NewConn(environ)
c.Assert(err, gc.IsNil)
s.repo = &charm.LocalRepository{Path: c.MkDir()}
}
开发者ID:jameinel,项目名称:core,代码行数:16,代码来源:conn_test.go
示例15: TestCanBootstrap
func (s *localHTTPSServerSuite) TestCanBootstrap(c *gc.C) {
restoreFinishBootstrap := envtesting.DisableFinishBootstrap()
defer restoreFinishBootstrap()
// For testing, we create a storage instance to which is uploaded tools and image metadata.
metadataStorage := openstack.MetadataStorage(s.env)
url, err := metadataStorage.URL("")
c.Assert(err, gc.IsNil)
c.Logf("Generating fake tools for: %v", url)
envtesting.UploadFakeTools(c, metadataStorage)
defer envtesting.RemoveFakeTools(c, metadataStorage)
openstack.UseTestImageData(metadataStorage, s.cred)
defer openstack.RemoveTestImageData(metadataStorage)
err = bootstrap.Bootstrap(coretesting.Context(c), s.env, environs.BootstrapParams{})
c.Assert(err, gc.IsNil)
}
开发者ID:jameinel,项目名称:core,代码行数:17,代码来源:local_test.go
示例16: TestNewConnWithoutAdminSecret
func (*NewConnSuite) TestNewConnWithoutAdminSecret(c *gc.C) {
cfg, err := config.New(config.NoDefaults, dummy.SampleConfig())
c.Assert(err, gc.IsNil)
ctx := coretesting.Context(c)
env, err := environs.Prepare(cfg, ctx, configstore.NewMem())
c.Assert(err, gc.IsNil)
envtesting.UploadFakeTools(c, env.Storage())
err = bootstrap.Bootstrap(ctx, env, environs.BootstrapParams{})
c.Assert(err, gc.IsNil)
attrs := env.Config().AllAttrs()
delete(attrs, "admin-secret")
env1, err := environs.NewFromAttrs(attrs)
c.Assert(err, gc.IsNil)
conn, err := juju.NewConn(env1)
c.Check(conn, gc.IsNil)
c.Assert(err, gc.ErrorMatches, "cannot connect without admin-secret")
}
开发者ID:jameinel,项目名称:core,代码行数:18,代码来源:conn_test.go
示例17: TestConnStateSecretsSideEffect
func (*NewConnSuite) TestConnStateSecretsSideEffect(c *gc.C) {
attrs := dummy.SampleConfig().Merge(coretesting.Attrs{
"admin-secret": "side-effect secret",
"secret": "pork",
})
cfg, err := config.New(config.NoDefaults, attrs)
c.Assert(err, gc.IsNil)
ctx := coretesting.Context(c)
env, err := environs.Prepare(cfg, ctx, configstore.NewMem())
c.Assert(err, gc.IsNil)
envtesting.UploadFakeTools(c, env.Storage())
err = bootstrap.Bootstrap(ctx, env, environs.BootstrapParams{})
c.Assert(err, gc.IsNil)
info, _, err := env.StateInfo()
c.Assert(err, gc.IsNil)
info.Password = utils.UserPasswordHash("side-effect secret", utils.CompatSalt)
// Use a state without a nil policy, which will allow us to set an invalid config.
st, err := state.Open(info, state.DefaultDialOpts(), state.Policy(nil))
c.Assert(err, gc.IsNil)
defer assertClose(c, st)
// Verify we have secrets in the environ config already.
statecfg, err := st.EnvironConfig()
c.Assert(err, gc.IsNil)
c.Assert(statecfg.UnknownAttrs()["secret"], gc.Equals, "pork")
// Remove the secret from state, and then make sure it gets
// pushed back again.
err = st.UpdateEnvironConfig(map[string]interface{}{}, []string{"secret"}, nil)
c.Assert(err, gc.IsNil)
// Make a new Conn, which will push the secrets.
conn, err := juju.NewConn(env)
c.Assert(err, gc.IsNil)
defer assertClose(c, conn)
statecfg, err = conn.State.EnvironConfig()
c.Assert(err, gc.IsNil)
c.Assert(statecfg.UnknownAttrs()["secret"], gc.Equals, "pork")
// Reset the admin password so the state db can be reused.
err = conn.State.SetAdminMongoPassword("")
c.Assert(err, gc.IsNil)
}
开发者ID:jameinel,项目名称:core,代码行数:44,代码来源:conn_test.go
示例18: TestConnWithPassword
func (*NewConnSuite) TestConnWithPassword(c *gc.C) {
attrs := dummy.SampleConfig().Merge(coretesting.Attrs{
"admin-secret": "nutkin",
})
cfg, err := config.New(config.NoDefaults, attrs)
c.Assert(err, gc.IsNil)
ctx := coretesting.Context(c)
env, err := environs.Prepare(cfg, ctx, configstore.NewMem())
c.Assert(err, gc.IsNil)
envtesting.UploadFakeTools(c, env.Storage())
err = bootstrap.Bootstrap(ctx, env, environs.BootstrapParams{})
c.Assert(err, gc.IsNil)
// Check that Bootstrap has correctly used a hash
// of the admin password.
info, _, err := env.StateInfo()
c.Assert(err, gc.IsNil)
info.Password = utils.UserPasswordHash("nutkin", utils.CompatSalt)
st, err := state.Open(info, state.DefaultDialOpts(), environs.NewStatePolicy())
c.Assert(err, gc.IsNil)
assertClose(c, st)
// Check that we can connect with the original environment.
conn, err := juju.NewConn(env)
c.Assert(err, gc.IsNil)
assertClose(c, conn)
// Check that the password has now been changed to the original
// admin password.
info.Password = "nutkin"
st1, err := state.Open(info, state.DefaultDialOpts(), environs.NewStatePolicy())
c.Assert(err, gc.IsNil)
assertClose(c, st1)
// Check that we can still connect with the original
// environment.
conn, err = juju.NewConn(env)
c.Assert(err, gc.IsNil)
defer assertClose(c, conn)
// Reset the admin password so the state db can be reused.
err = conn.State.SetAdminMongoPassword("")
c.Assert(err, gc.IsNil)
}
开发者ID:jameinel,项目名称:core,代码行数:44,代码来源:conn_test.go
示例19: BootstrapOnce
func (t *LiveTests) BootstrapOnce(c *gc.C) {
if t.bootstrapped {
return
}
t.PrepareOnce(c)
// We only build and upload tools if there will be a state agent that
// we could connect to (actual live tests, rather than local-only)
cons := constraints.MustParse("mem=2G")
if t.CanOpenState {
_, err := sync.Upload(t.Env.Storage(), nil, coretesting.FakeDefaultSeries)
c.Assert(err, gc.IsNil)
}
envtesting.UploadFakeTools(c, t.Env.Storage())
err := bootstrap.EnsureNotBootstrapped(t.Env)
c.Assert(err, gc.IsNil)
err = bootstrap.Bootstrap(coretesting.Context(c), t.Env, environs.BootstrapParams{Constraints: cons})
c.Assert(err, gc.IsNil)
t.bootstrapped = true
}
开发者ID:jameinel,项目名称:core,代码行数:19,代码来源:livetests.go
示例20: TestBootstrapInstanceUserDataAndState
// It should be moved to environs.jujutests.Tests.
func (s *localServerSuite) TestBootstrapInstanceUserDataAndState(c *gc.C) {
env := s.Prepare(c)
envtesting.UploadFakeTools(c, env.Storage())
err := bootstrap.Bootstrap(bootstrapContext(c), env, environs.BootstrapParams{})
c.Assert(err, gc.IsNil)
// check that the state holds the id of the bootstrap machine.
stateData, err := bootstrap.LoadState(env.Storage())
c.Assert(err, gc.IsNil)
c.Assert(stateData.StateInstances, gc.HasLen, 1)
insts, err := env.AllInstances()
c.Assert(err, gc.IsNil)
c.Assert(insts, gc.HasLen, 1)
c.Check(stateData.StateInstances[0], gc.Equals, insts[0].Id())
bootstrapDNS, err := insts[0].DNSName()
c.Assert(err, gc.IsNil)
c.Assert(bootstrapDNS, gc.Not(gc.Equals), "")
}
开发者ID:jameinel,项目名称:core,代码行数:21,代码来源:local_test.go
注:本文中的github.com/wallyworld/core/environs/testing.UploadFakeTools函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论